2016-07-27 48 views
0

我在那里,我在我的配置手动创建DatasourceJdbcTemplate,因为我需要解密的数据源密码弹簧启动应用程序没有合格豆。春天错误类型的JdbcTemplate

由于我正在配置连接属性,因此我正在使用tomcat DataSourceorg.apache.tomcat.jdbc.pool.DataSource),这是在spring启动文档中推荐的。

我不包括数据源自动配置(见Application.java),因为我手动创建一个。

Application.java

// exclude datasourceAutoConfiguration since we are creating manaully creating datasource bean in AppConfig 
@SpringBootApplication 
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

这里是我的application.properties文件

jdbc.hostdb.url=jdbc:jtds:sqlserver://hello-world:1122/foobar 
host.jdbc.hostdb.username=foo 
host.jdbc.hostdb.password=encryptedPassword 
host.jdbc.hostdb.driver=net.sourceforge.jtds.jdbc.Driver 
secret=afasdfansdfsdfsd 

AppConfig.java

import org.apache.tomcat.jdbc.pool.DataSource; 

@ComponentScan("com.company.foo") 
public class AppConfig { 


    @Value("${jdbc.hostdb.driver}") 
    private String driver; 

    @Value("${jdbc.hostdb.url}") 
    private String url; 

    @Value("${jdbc.hostdb.username}") 
    private String user; 

    @Value("${jdbc.hostdb.password}") 
    private String pass; 

    @Value("${secret}") 
    private String secret; 


    @Bean 
    public DataSource datasource_mydb(Encryption encryption) { 
     DataSource ds = new DataSource(); 
     ds.setDriverClassName(hostdb_driver); 
     ds.setUrl(hostdb_url); 
     ds.setUsername(hostdb_user); 
     ds.setPassword(encryption.decrypt(hostdb_pass)); 
     return ds; 
    } 


    @Bean 
    Encryption encryption() { 
     return new Encryption(secret); 
    } 

    @Bean 
    public JdbcTemplate jdbcTemplate(DataSource dataSource) { 
     return new JdbcTemplate(dataSource); 
    } 

} 

MyRepository.java

@Repository 
public class MyRepository { 

    JdbcTemplate jdbcTemplate; 

    @Autowired 
    public MyRepository(JdbcTemplate jdbcTemplate){ 
     this.jdbcTemplate=jdbcTemplate; 
    } 
} 

当我开始spring容器,我收到以下错误

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'MyRepository' defined in file [/Users//Documents/codebase/my-service/build/classes/main/com/company/foo/MyRepository.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.springframework.jdbc.core.JdbcTemplate]: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) ~[spring-context-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.6.RELEASE.jar:1.3.6.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:760) [spring-boot-1.3.6.RELEASE.jar:1.3.6.RELEASE] 
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:360) [spring-boot-1.3.6.RELEASE.jar:1.3.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:306) [spring-boot-1.3.6.RELEASE.jar:1.3.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185) [spring-boot-1.3.6.RELEASE.jar:1.3.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174) [spring-boot-1.3.6.RELEASE.jar:1.3.6.RELEASE] 
    at com.concur.cognos.authentication.Application.main(Application.java:14) [main/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_102] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_102] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_102] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102] 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) [idea_rt.jar:na] 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE] 
    ... 24 common frames omitted 

2016-07-26 1 
+1

没有为'AppConfig'定义的bean。也许你打算用'@ Configuration'来注释它。 –

+0

@SotiriosDelimanolis:是的,修正了它。我不知道我是如何错过它的。感谢接住 –

+0

@SotiriosDelimanolis:我确实需要'@EnableAutoConfiguration(不含= {} DataSourceAutoConfiguration.class)'以避免自动配置或没有春天看到我的数据源豆,而不是自动配置呢? –

回答

-1

如果添加@Autowired

JdbcTemplate jdbcTemplate; 
在MyRepository类

,那么它会工作。

下面是从你的异常线索。

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency 
+0

没有。我第一次尝试过。它不起作用。因此我转移到基于此职位的基于构造函数的注入。 HTTP://计算器。com/questions/26933286/spring-loads-component-before-needed-bean –

0

问题在于你的bean定义的参数。他们的价值从何而来?例如 -

@Bean 
public JdbcTemplate jdbcTemplate(DataSource dataSource) { 
    return new JdbcTemplate(dataSource); 
} 

这里您没有指定dataSource参数的值来自哪里。 datasource_mydb bean也一样。在bean定义上使用@Autowire接受其他bean作为输入参数。

@Bean 
@Autowired 
public DataSource datasource_mydb(Encryption encryption) { 
    DataSource ds = new DataSource(); 
    ds.setDriverClassName(hostdb_driver); 
    ds.setUrl(hostdb_url); 
    ds.setUsername(hostdb_user); 
    ds.setPassword(encryption.decrypt(hostdb_pass)); 
    return ds; 
} 


@Bean 
Encryption encryption() { 
    return new Encryption(secret); 
} 

@Bean 
@Autowired 
@Qualifier("datasource_mydb") 
public JdbcTemplate jdbcTemplate(DataSource dataSource) { 
    return new JdbcTemplate(dataSource); 
} 
+0

我不认为这是必要的。 @SotiriosDelimanolis你觉得呢? –

+2

不,这根本没有必要。 @brainstorm Spring会通过检查相应bean的上下文来解析'@ Bean'方法的参数。您已经定义了一个名为'datasource_mydb'的'DataSource' bean,因此它可用于'JdbcTemplate' bean方法。 –

+0

@SotiriosDelimanolis和文档链接验证此?如果是这种情况,那么OP错误的原因是bean的名称“datasource_mydb”,它不会按名称“dataSource”映射。 –