我正在尝试将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
以上设置适用于“非抽象类”设置。请帮助我,让我知道我做错了什么
答案 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);
}
}