Spring自动装配为Abstract类提供null bean

时间:2016-11-01 18:36:32

标签: java spring autowired jdbctemplate illegalargumentexception

我正在尝试将JDBCTemplate注入(自动装配)到我的Dao类中,这是一个“抽象类”,这不起作用,因为Spring为JDBCTemplate提供了null bean。

public abstract class SSODaoImpl extends NamedParameterJdbcDaoSupport implements  SSODao{

    public SSODaoImpl(){

    }
    @Autowired //giving null jdbcTemplate
    public SSODaoImpl(JdbcTemplate jdbcTemplate){
    super.setJdbcTemplate(jdbcTemplate);
    }
}

SSODaoImpl扩展了我的许多其他DAO,如下面的

@Repository("askBenefitsDAO")
public class AskBenefitsSSODaoImpl extends SSODaoImpl{
}

我在文件JDBCContext.xml中创建了bean,并在web.xml中引用它

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
     <property name="jndiName" value="java:comp/env/jndi/hpdb_hrdb"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>

Web.xml中

<context-param>
    <param-name> /WEB-INF/spring/JDBCTemplate/JDBCContext.xml</param-value>       
</context-param> 

启动应用程序时来自spring的错误消息

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'askBenefitsDAO' defined in file [AskBenefitsSSODaoImpl.class]: 
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required

以上设置适用于“非抽象类”设置。请帮助我,让我知道我做错了什么

1 个答案:

答案 0 :(得分:0)

原因是因为 spring并没有直接调用SSODaoImpl 类的构造函数,而是在Spring实例化AskBenefitsSSODaoImpl类时发生其构造函数的调用。因此Spring无法将jdbcTemplate绑定到您的SSODaoImpl类。

您可以通过以下方式修改代码来实现此目的:

@Repository("askBenefitsDAO")
public class AskBenefitsSSODaoImpl extends SSODaoImpl{
@Autowired 
    public AskBenefitsSSODaoImpl(JdbcTemplate jdbcTemplate){
    super(jdbcTemplate);
    }

}

public abstract class SSODaoImpl extends NamedParameterJdbcDaoSupport implements  SSODao{

    public SSODaoImpl(){

    }
    public SSODaoImpl(JdbcTemplate jdbcTemplate){
    super.setJdbcTemplate(jdbcTemplate);
    }
}