2016-07-27 33 views
0

Ich habe eine Spring Boot-Anwendung, wo ich Datasource und JdbcTemplate manuell in meiner Konfiguration erstellen, da ich Datenquellenpasswort entschlüsseln muss.spring error Keine berechtigende Bean vom Typ JdbcTemplate

Ich verwende Tomcat DataSource (org.apache.tomcat.jdbc.pool.DataSource) wie in Spring Boot Docs empfohlen, da ich Verbindungseigenschaften konfigurieren.

Ich schließe Autokonfiguration für Datenquelle aus (siehe Application.java), da ich eine manuell erstelle.

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); 
    } 
} 

Hier ist meine application.properties Datei

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); 
    } 

} 

603.210 MyRepository.java

@Repository 
public class MyRepository { 

    JdbcTemplate jdbcTemplate; 

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

, wenn ich Federbehälter zu starten, bekomme ich folgende Fehler

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

Es ist keine Bean für 'AppConfig' definiert. Vielleicht solltest du es mit '@ Configuration' kommentieren. –

+0

@SotiriosDelimanolis: ja, das hat es behoben. Ich weiß nicht, wie ich es verpasst habe. Danke, dass Sie es gefunden haben –

+0

@SotiriosDelimanolis: Ich brauche '@EnableAutoConfiguration (exclude = {DataSourceAutoConfiguration.class})' um Autokonfiguration zu vermeiden oder sieht der Frühling meine Datenquelle Bean und nicht automatisch konfigurieren? –

Antwort

-1

Wenn Sie @Autowired in

JdbcTemplate jdbcTemplate; 

in MyRepository Klasse hinzufügen, dann wird es funktionieren .

Unten ist der Hinweis von Ihrer Ausnahme.

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

nein. Ich habe das zuerst versucht. Es hat nicht funktioniert. und daher bin ich auf der Basis dieses Beitrags zur konstruktorbasierten Injektion übergegangen. http: // Stapelüberlauf.com/questions/26933286/spring-loads-component-before-the-required-bean –

0

Das Problem ist mit den Argumenten Ihrer Bean-Definitionen. Woher würden ihre Werte kommen? Zum Beispiel -

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

Hier haben Sie nicht angegeben, wo würde Wert von dataSource Argumente kommen. Derselbe Fall von datasource_mydb Bean. Verwenden Sie @Autowire für Bean-Definitionen, um andere Beans als Eingabeargumente zu akzeptieren.

@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

Ich glaube nicht, dass es notwendig ist. @SotiriosDelimanolis was denkst du? –

+2

Nein, das ist überhaupt nicht notwendig. @brainstorm Spring löst Argumente für '@ Bean'-Methoden auf, indem der Kontext für die entsprechenden Beans überprüft wird. Sie haben eine 'DataSource'-Bean mit dem Namen' datasource_mydb' definiert, die für die Bean-Methode 'JdbcTemplate' verfügbar ist. –

+0

@SotiriosDelimanolis und doc Link zur Validierung dieser? Wenn dies der Fall ist, ist der Grund für den Fehler von OP der Bean-Name "datasource_mydb", der nicht nach dem Namen "dataSource" abbildet. –