繁体   English   中英

春季自动装配为Abstract类提供了空bean

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM