2017-08-18 1 views
0

J'ai une application Spring Boot (orientée par lots) qui utilise une source de données afin de finaliser un travail par lots et d'écrire des éléments dans la base de données.Spring Boot (Batch) - Inject Datasource

J'ai la source de données (s) défini à l'intérieur du application.yml comme:

spring: 
    datasource: 
    url: jdbc:h2:mem:JavaSpringBootBatch 
    username: sa 
    password: 
    profiles: # default, development, production 
    active: default, development 
--- 
spring: 
    h2: 
    # ...config/settings here 
    profiles: development 
--- 
spring: 
    datasource: 
    # ...datasource config here 
    profiles: production 

La question est quand je tente d'injecter la source de données dans l'un des fichiers de configuration de printemps:

@Configuration 
public class PlayerBatchConfig { 
    ... 

    @Bean 
    public ItemWriter<Player> writer(final DataSource dataSource) { 
    final JdbcBatchItemWriter<Player> jdbcItemWriter = new JdbcBatchItemWriter<>(); 
    ... 
    jdbcItemWriter.setDataSource(dataSource); 
    jdbcItemWriter.setSql(sql.toString()); 
    return jdbcItemWriter; 
    } 
} 

. ..it me dit que:

Impossible d'autowire. Il y a plus d'un bean de type 'DataSource'.

haricots: dataSource (DataSourceConfiguration.class) dataSource (EmbeddedDataSourceConfiguration.class)

J'ai aussi essayé d'injecter la source de données comme:

@Configuration 
public class PlayerBatchConfig { 
    @Bean 
    @ConfigurationProperties(prefix = "datasource") 
    public DataSource dataSource() { 
    return DataSourceBuilder.create().build(); 
    } 

    ... 
} 

... mais pas de chance :(, bien que le problème avec les deux sources de données disparaisse finalement

Des indices pour "contourner" cela?

+0

Je pense que "spring.h2.console.enabled = true" et "spring.h2.console.path =/h2-console" active la base de données h2 et vous avez défini explicitement une autre source de données et les deux sont pour le profil de "développement" . Ainsi conteneur voyant comme source de données multiples. – surya

+0

Pas tout à fait ceux-là, mais la définition réelle sur le morceau de profil 'default'. Cela ne vous permet d'accéder à la console H2 que lorsque 'développement' est utilisé en naviguant' http: //.../ h2-console' –

Répondre

0

Puisque vous avez 2 sources de données, vous devez les annoter avec @Qualifier le bean datasources et quand vous les utilisez également. Le printemps vous dit qu'il ne sait pas lequel vous voulez utiliser.

0

Le DataSource que vous souhaitez utiliser annotate avec @Primary, reportez-vous la documentation démarrage du printemps here pour plus d'info. Avec @Primary vous devrez peut-être également utiliser @Qualifier pour contrôler l'injection de haricot.

+0

Comme je l'ai dit, le problème est que je ne voudrais pas revenir en arrière et configurer le datasource (s) dans la configuration Java; Je voudrais les garder dans le fichier YAML. Quoi qu'il en soit, je l'ai comme ça pour l'instant puisque je ne trouve pas de moyen de le faire fonctionner jusqu'ici, mais oui, si je le fais avec la config Java est un peu facile ... –