0

Я пытаюсь внедрить (Autowire) JDBCTemplate в мой класс Dao, который является «абстрактным классом». Это не работает, а весна дает нулевой компонент для JDBCTemplate.Spring autowiring дает 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 и ссылки его в 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> 

Веб.xml

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

Сообщения об ошибке с весны, а запуск приложения

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 

выше установка работает для «Non Абстрактного класса» создан. Пожалуйста, помогите мне с этим и дайте мне знать, что я делаю неправильно

+0

Я не уверен, что это связано с абстрактным классом. JdbcTemplate берет 'javax.sql.DataSource' в своем конструкторе. Из xml аргумент конструктора ссылается на dataSource, но dataSource не является 'javax.sql.DataSource'. –

+0

@ Andrew S Я назвал ссылку ниже [ссылка] (http://stackoverflow.com/questions/9183321/how-to-use-jndi-datasource-provided-by-tomcat-in-spring) – krrish0690

ответ

0

Причина заключается в том, потому что пружина непосредственно не вызывая конструктор вашего класса SSODaoImpl, вместо этого вызова его конструктора происходит, когда весна создавая экземпляр класса 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); 
    } 
}