2017-05-25 6 views
0

Ich habe den seltsamsten Situationen, wenn zwei Datasources in meiner Frühlings-Boot-App konfigurieren, die mit nur einer funktionierte OK:Konfigurieren Sie zwei Datasources im Frühjahr Boot-

@Configuration 
(...) 
    @Bean(destroyMethod = "close") 
    protected DataSource applicationDataSource(
     (...) 
     return dataSource; 
    } 

und mit zwei:

@Configuration 
(...) 
    @Bean(destroyMethod = "close") 
    @Primary 
    protected DataSource applicationDataSource(
     (...) 
     return dataSource; 
    } 

@Configuration 
(...) 
    @Bean 
    protected DataSource localDataSource(
     (...) 
     return dataSource; 
    } 

(sie sind in verschiedenen Konfigurationsdateien)

Jetzt ist das Merkwürdige, dass mit zwei DS gibt es keine verwandten spezifischen Fehler. Der Fehler, den ich bekomme, ist ein scheinbar nicht zusammenhängender Fehler, der besagt, dass er keine Injected Bean-Instanz finden kann (in einer komplett anderen Konfigurationsdatei, die nichts mit DataSources zu tun hat). Ich habe bemerkt, dass bei der Verwendung von nur einem DS, dass DS-Bean vor der Bean, die in dem Fehler angezeigt wird, instanziiert wird, was mich denken lässt, dass sie bei der Definition von zwei DS einfach ignoriert werden.

Ich habe versucht, viele Dinge, auch die zweite Bohne als eine andere Art von DS erklärt

@Configuration 
(...) 
    @Bean 
    protected HikariDataSource localDataSource(
     (...) 
     return dataSource; 
    } 

aber nichts funktionierte.

Jetzt für das Seltsamste, fand ich einen Hack heraus, dass, indem er erklärt, die zweite Bohne als Objekt (!!!)

@Configuration 
(...) 
    @Bean 
    protected Object localDataSource(
     (...) 
     return dataSource; 
    } 

Dies funktioniert funktioniert !!! Ich muss es einfach woanders umsetzen (zum Beispiel eine SqlSessionFactoryBean oder DataSourceTransactionManager implementieren).

Beachten Sie, dass die Methoden geschützt sind, aber ich auch mit der Öffentlichkeit getestet. Wie für die Frühlings-Boot-App getestet ich sowohl mit oder ohne Ausschluss

@Configuration 
@SpringBootApplication 
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) 

Also habe ich es zu arbeiten und alles ist gut, aber ich kann nicht verstehen, wie der Teufel das passiert und ich wold es wirklich machen möchte Arbeit ohne Hacks ...

Prost.

+0

Können Sie den Stacktrace buchen? –

+0

überprüfen Sie diese https://stackoverflow.com/questions/30337582/spring-boot-configure-and-use-two-datasources – gladiator

Antwort

0

Ich vermute, dass Sie ein autowiring Problem haben wegen mit zwei Bohnen vom Typ Datasource konfiguriert, möglicherweise mit mehr als einem markiert mit @Primary

für org.springframework Anmeldung Einschalten sollte diese markieren. Veröffentlichen Sie das Startprotokoll.

Ihr Fix funktioniert, weil Sie tatsächlich nur eine Bean vom Typ DataSource erstellen, sodass das Problem mit dem Autowiderlauf behoben wird.

Verwandte Themen