[英]Spring autowiring gives null bean for Abstract class
我试图将(Autowire)JDBCTemplate注入到我的Dao类中,该类是一个“抽象类”,这不起作用,并且由于spring为JDBCTemplate提供了空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
上面的设置适用于“非抽象类”设置。 请帮助我,让我知道我做错了什么
原因是因为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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.