Parameter 0 of constructor in work.dao.impl.SqlDaoImpl required a bean of type 'org.springframework.jdbc.core.JdbcTemplate' that could not be found.
- Bean method 'jdbcTemplate' in 'JdbcTemplateAutoConfiguration' not loaded because @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) found beans 'jdbcTemplateOnlyRead', 'jdbcTemplateAdminSelf', 'jdbcTemplateHistoryWrite', 'jdbcTemplateWriteMysql', 'jdbcTemplateRead', 'jdbcTemplateReadMysql', 'jdbcTemplateHistoryRead', 'jdbcTemplateWrite'
JdbcTemplateAutoConfiguration中的方法jdbcTemplate加载失败,找到JdbcTemplateAutoConfiguration这个类:
@Configuration
@ConditionalOnClass({DataSource.class, JdbcTemplate.class})
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class JdbcTemplateAutoConfiguration {
private final DataSource dataSource;
public JdbcTemplateAutoConfiguration(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean
@Primary
@ConditionalOnMissingBean({JdbcOperations.class})
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(this.dataSource);
}
会发现在jdbcTemplate方法上有个@ConditionalOnMissingBean的注释,这个注释其实说的是当存在JdbcOperations这个类的对象时就跳过这个方法,所以会造成jdbcTemplate加载失败.
原因是因为在applicationContext.xml中配置了
<bean id="jdbcTemplateWrite" class="org.springframework.jdbc.core.JdbcTemplate">
<qualifier value="dataSourceWrite"/>
</bean>
去掉这个bean,重新再其他地方进行配置org.springframework.jdbc.core.JdbcTemplate,比如我自己写了一个加载配置文件的类,并在配置类中进行配置
@Configuration
@ImportResource("classpath:application-context.xml")
public class ConfigClass {
@Bean("jdbcTemplateWrite")
public JdbcTemplate jdbcTemplateWrite(@Qualifier("dataSourceWrite")DataSource dataSource){
JdbcTemplate jdbcTemplate=new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
就可以解决这个问题了。.