2017-07-07 4 views
0

Ich habe zwei Webservices mit Spring Boot Framework entwickelt und ich habe sie im selben Projekt. Jeder Webservice verwendet eine andere DB, zB ws1 verwendet Oracle1 und ws2 Oracle2. Ich habe eine DataBaseConfig mit der Definition der Beans definiert, aber wenn ich die App benutze, arbeitet immer ein Webservice (und es ist immer derselbe).SpringBoot Web Services mehrere Datenquellen nur eine funktioniert

DataBaseConfig

@Configuration 
public class DataBaseConfig { 
@Bean(name = "ora1") 
@ConfigurationProperties(prefix="spring.datasource") 
public DataSource mysqlDataSource() { 
    return DataSourceBuilder.create().build();} 

@Bean(name = "ora2") 
@ConfigurationProperties(prefix="spring.secondDatasource") 
public DataSource sqliteDataSource() { 
    return DataSourceBuilder.create().build();} 

@Bean(name = "clients") 
    @Autowired 
    @ConfigurationProperties(prefix = "spring.datasource") 
    @Qualifier("datasource") 
    public JdbcTemplate slaveJdbcTemplate(DataSource datasource) { 
     return new JdbcTemplate(datasource); } 

    @Bean(name = "places") 
    @Autowired 
    @Primary 
     @ConfigurationProperties(prefix = "spring.secondDatasource") 
    @Qualifier("secondDatasource") 
    public JdbcTemplate masterJdbcTemplate(DataSource secondDatasource) { 
     return new JdbcTemplate(secondDatasource);} 
} 

Ich habe die Dienste Definition mit den SQL-Anweisungen und die Definition

@Service 
public class ClientsService { 

@Autowired 
@Qualifier("clients") 
private JdbcTemplate jdbcTemplate; 

und den anderen Dienst

@Service 
public class PlacesService { 

@Autowired 
@Qualifier("places") 
private JdbcTemplate jdbcTemplate; 

Dann in jedem Controller I de-Mapping habe @RequestMapping. Wenn ich die App starte, habe ich keine verbindungsbedingten Fehler und wenn ich die Webservices in 2 Projekten teile, funktioniert alles gut.

+0

Anstelle von '@Qualifier (" Datenquelle ")' und '@Qualifier (" zweiteDatenquelle ")' sollte es '@Qualifier (" ora1 ")' und '@Qualifier (" ora2 ")' sein, sollte es nicht ? – alfcope

+0

Ich habe das versucht, funktioniert aber immer noch nicht. Die ws, die funktioniert, ist nicht die eine, die als 'Primary' festgelegt wurde. Der Fehler, den ich für die Webservice 'Clients' bekomme, ist ORA-00942: Tabelle oder View existiert nicht, aber die Query funktioniert (ich habe auch die Webservices in separaten Projekten korrekt ausgeführt) – lorenag83

Antwort

0

Sie haben hier ein paar Dinge schief gehen, einschließlich einiger unnötiger Anmerkungen. Siehe unten, beachten Sie die Lage von @Qualifier und den Qualifier Name:

@Bean(name = "clients") 
public JdbcTemplate slaveJdbcTemplate(@Qualifier("ora1") DataSource datasource) { 
    return new JdbcTemplate(datasource); 
} 

@Bean(name = "places") 
@Primary 
public JdbcTemplate masterJdbcTemplate(@Qualifier("ora2") DataSource secondDatasource) { 
    return new JdbcTemplate(secondDatasource); 
} 
+0

Das hat's geschafft! Danke ! – lorenag83

0

Statt Lösung von Bohnen Namen, die IMO eine schlechte Idee ist, weil es nicht ist typsicher, warum Sie nicht Konstruktor Injektion verwenden und erstellen die Dienste in der Konfigurationsklasse (Graben @Service Annotation). Erstellen Sie die Beans DataSource und JdbcTemplate wie üblich, geben Sie ihnen keine Namen (der Standard ist der Methodenname), und erstellen Sie auch new PlacesService(placesJdbcTemplate()). Das Ergebnis ist ein viel einfacherer Code.

Dies setzt voraus, dass beide Datenbanken zur Laufzeit aktiv sein sollen. Wenn nicht, verwenden Sie @Profile.