飘逸的ITER 2012-01-05 10:18
浏览 299
已采纳

Spring 注入为空

在一个SSH的项目中遇到一个问题,我有一个dao的接口BaseJdbcDao,和一个dao的实现类BaseJdbcDaoImpl,实现类已经通过注解提交给容器进行管理,然后有一个工具类MailHelper想通过自动装配载入dao的实现类,可是每次都没有装配成功,代码如下,请教各位:
[code="java"]
package base;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.support.rowset.SqlRowSet;
public interface BaseJdbcDao {

public abstract List queryForList(String sql);

public abstract int queryForInt(String sql);

public abstract SqlRowSet queryForRowSet(String sql);

public abstract int update(String sql);

public abstract Map queryForMap(String sql);

public abstract void delete(String sql);

public abstract void insert(String sql);

}
[/code]
[code="java"]
package base.impl;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import base.BaseJdbcDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository("basejdbcdao")
public class BaseJdbcDaoImpl implements BaseJdbcDao {

private  JdbcTemplate jdbcTemplate;

public  JdbcTemplate getJdbcTemplate() {
    return jdbcTemplate;
}

@Autowired
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

public List queryForList(String sql){
    System.out.println(sql);
       return this.getJdbcTemplate().queryForList(sql);
    }

public int queryForInt(String sql){
    System.out.println(sql);
    return this.getJdbcTemplate().queryForInt(sql);
}

public SqlRowSet queryForRowSet(String sql){
    System.out.println(sql);
    return this.getJdbcTemplate().queryForRowSet(sql);
}

public int update(String sql){
    System.out.println(sql);
    return this.getJdbcTemplate().update(sql);
}

public Map queryForMap(String sql){
    System.out.println(sql);
    return this.getJdbcTemplate().queryForMap(sql);
}

public void delete(String sql){
    System.out.println(sql);
    this.getJdbcTemplate().update(sql);
}

public void insert(String sql){
    System.out.println(sql);
    this.getJdbcTemplate().execute(sql);
}

}
[/code]
[code="java"]package util;
import java.io.IOException;
import java.util.HashMap;
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import java.util.Date;
import javax.activation.DataHandler;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import util.ByteArrayDataSource;
import javax.mail.PasswordAuthentication;
import base.BaseJdbcDao;
import base.impl.BaseJdbcDaoImpl;

public class MailHelper {

@Autowired
@Qualifier("basejdbcdao")
private BaseJdbcDao dao;

private String email;
private String mobile;
private String school;
private String name;
private String remark;
private String appstr; 

public MailHelper(String school,String name,String mobile,String email,String remark,String appstr){
    this.email =  email;
    this.mobile = mobile;
    this.school = school;
    this.name = name;
    this.remark = remark;
    this.appstr = appstr;
}

public MailHelper(){};

public void sendMail(){
   this.insertData(school,name,mobile,email,remark,appstr);
}



/**
 * 帐号申请的功能
 * @param template
 * @param pschool
 * @param pname
 * @param pmobile
 * @param pemail
 * @param premark
 */
public void insertData(String pschool,String pname,String pmobile,String pemail,String premark,String appstr){
    String email = changeContent( pemail);
    String mobile = changeContent( pmobile);
    String school =changeContent (pschool);
    String name =changeContent (pname);
    String remark = changeContent (premark);
    String to  = "test@163.com";
    String subject = "申请";
    StringBuilder sb = new StringBuilder("insert into maillist(linkman,school,mobile,mail,remark)values('"+name+"','"+school+"','"+mobile+"','"+email+"','"+remark+"')");
    dao.update(sb.toString());
    remark = "内容略。。";
    this.send(  to, subject, remark);
}

/**
 * Sending a mail with given values.<br>
 * content parameter means the main email text,it refers to a html file. 
 * 
 * @param smtpServer
 * @param to
 * @param from
 * @param subject
 * @param content
 * @param emailUsername
 * @param emailUserpass
 * @author WYQ
 */ 
private String send(String to,String subject,String content) {
    try {
        HashMap<String,String> map = readParamters();
        String smtpserver = map.get("smtpserver");
        String publicaccount = map.get("publicaccount");
        String publicpwd = map.get("publicpwd");
        String from = map.get("publicmail");

        Properties props = System.getProperties();
        props.put("mail.smtp.port", "25");
        props.put("mail.smtp.starttls.enable","false");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", smtpserver);

        Session session = null;
        session = Session.getDefaultInstance(props,new PasswordAuthenticator(publicaccount,publicpwd));

        Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(from));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(  to, false));
        msg.setSubject(subject);
        msg.setDataHandler(new DataHandler(new ByteArrayDataSource(content,"text/html; charset=\"utf-8\"")));
        msg.setHeader("X-Mailer", "XML-Mail");
        msg.setSentDate(new Date());
        // -- Send the message --
        Transport.send(msg);
        return "success";
    } catch (Exception ex) {
        return "Error" + ex;
    }
}


private HashMap<String,String> readParamters(){
    HashMap<String,String> map = new HashMap<String,String>();
    Properties properties =new Properties();
    try {
           properties.load(MailHelper.class.getClassLoader().getResourceAsStream("mail.properties"));
           map.put("smtpserver",   properties.getProperty("smtpserver"));
           map.put("publicmail",   properties.getProperty("publicmail"));
           map.put("publicaccount",   properties.getProperty("publicaccount"));
           map.put("publicpwd",   properties.getProperty("publicpwd"));
          } catch (IOException e) {
           e.printStackTrace();
     }
      return map;
}

}

class PasswordAuthenticator extends Authenticator {
private String username;
private String password;

public PasswordAuthenticator(String username, String password) {
    this.username = username;
    this.password = password;
}
protected PasswordAuthentication  getPasswordAuthentication() {
    return new PasswordAuthentication (username, password);
}

}

[/code]
然后我在struts的action类中调用MailHelper的send方法进行邮件发送时,打印的dao总是为空,action的代码是:
[code="java"]
/**
* 帐号申请-邮件发送
* @return
*/
public String sendMail(){
MailHelper mh = new MailHelper();
mh.sendMail();
success = true;
return SUCCESS;
}
[/code]
spring的自动扫描和注解配置已经开启,也已经把dao的package路径和MailHelper的package路径加入到基类中了,
[code="java"]

[/code]
现在就是弄不明白,为什么通过new出来的MailHelper对象中注入的dao总是为空呢。

  • 写回答

3条回答 默认 最新

  • oxcow 2012-01-05 11:28
    关注

    给你点代码片段,参考下:
    [code="java"]
    // dao
    public class BaseDaoHibernate extends
    HibernateDaoSupport implements BaseDao {
    protected Class persistentClass;

    @Autowired
    public void setSessionFactory0(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);
    }
    

    @Repository("authorizeDao")
    public class AuthorizeDaoHibernate extends BaseDaoHibernate
    implements AuthorizeDao {
    private Criteria getAuthorizeCriteria(Authorize auth) {
    Criteria crit = getCriteria();
    Example example = Example.create(auth);
    example.enableLike(MatchMode.ANYWHERE);
    crit.add(example);
    if (auth.getDate_s() != null) {
    crit.add(Restrictions.ge("createDate", auth.getDate_s()));
    }
    if (auth.getDate_e() != null) {
    crit.add(Restrictions.le("createDate", auth.getDate_e()));
    }
    return crit;
    }

    // service
    @Service("authorizeService")
    public class AuthorizeServiceImpl implements AuthorizeService {
    @Autowired
    private AuthorizeDao authorizeDao;

    public Authorize getAuthorizeByAuthId(Long authId) {
        return authorizeDao.getById(authId);
    }
    
    public List<Authorize> findAll() {
        return authorizeDao.findAll();
    }
    

    //action
    @SuppressWarnings("serial")
    public class AdminAction extends AuthAction {
    private SiteBackGroudUser user;
    private Long keyId;

    private List<Authorize> auths;
    
    private Page page;
    
    @Autowired
    private SiteBackGroudUserService siteBackGroudUserService;
    
    @Autowired
    private AuthorizeService authorizeService;
    

    [/code]
    applicationContext.xml
    [code="xml"]
    <?xml version="1.0" encoding="UTF-8"?>

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <!-- ========================= RESOURCE DEFINITIONS ========================= -->
    
    <!-- Configurer that replaces ${...} placeholders with values from a properties 
        file -->
    <!-- (in this case, JDBC-related settings for the dataSource definition 
        below) -->
    <context:property-placeholder
        location="classpath:jdbc.properties,classpath:chinapay_conf.properties,classpath:unionpay_conf.properties" />
    
    <!-- Uses Apache Commons DBCP for connection pooling. See Commons DBCP documentation 
        for the required JAR files. Alternatively you can use another connection 
        pool such as C3P0, similarly configured using Spring. -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" />
    
    
    
    <!-- Hibernate SessionFactory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
        p:dataSource-ref="dataSource">
        <property name="packagesToScan" value="com.yintong.model" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
                <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop>
                <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
                <!-- 缓存配置 -->
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.OSCacheProvider</prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.search.default.directory_provider">org.hibernate.search.store.FSDirectoryProvider
                </prop>
                <prop key="hibernate.search.default.indexBase">E:/indexes
                </prop>
            </props>
        </property>
        <property name="eventListeners">
            <map>
                <entry key="merge">
                    <bean
                        class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
                </entry>
            </map>
        </property>
    </bean>
    
    <!-- Transaction manager for a single Hibernate SessionFactory (alternative 
        to JTA) -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager"
        p:sessionFactory-ref="sessionFactory" />
    
    
    <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
    
    <!-- Activates various annotations to be detected in bean classes: Spring's 
        @Required and @Autowired, as well as JSR 250's @Resource. -->
    <context:annotation-config />
    <context:component-scan
        base-package="com.dao.hibernate,
        com.service.impl," />
    
    <!-- Instruct Spring to perform declarative transaction management automatically 
        on annotated classes. -->
    <tx:annotation-driven />
    
    <!-- Exporter that exposes the Hibernate statistics service via JMX. Autodetects 
        the service MBean, using its bean name as JMX object name. -->
    <context:mbean-export />
    


    [/code]

    spring和struts2的结合不需要配置,因为struts默认 spring 自动注入,只要保持你声明的@Service("authorizeService")中的名称与action中该对象的变量名一样就行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)