2017-08-18 8 views
2

Springブートアプリケーションでは、同じプレフィックスを持つ@ConfigurationProperties注釈を使用して、プロファイルに応じて2つのデータソースを設定します。なぜそれはSpringブート設定プロセッサによって禁止されていますか? Gradleので報告されたエラーは次のとおりです。スプリングブートコンフィギュレーションプロセッサ、プレフィックスの@ConfigurationProperties定義の重複

... 
:compileJava ... error: Duplicate `@ConfigurationProperties` definition for prefix 'spring.datasource' 

注:

  • "ファイル名を指定して実行AS->春ブーツのAppは、" 春・ブート・コンフィギュレーション・プロセッサ依存性がないとSTS
  • で動作し、Gradleのビルド作品(ただし、警告When using @ConfigurationProperties it is recommended to add 'spring-boot-configuration-processor' to your classpath to generate configuration metadataが表示されます)

build.gradle

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.6.RELEASE") 
    } 
} 

apply plugin: 'java' 
apply plugin: 'eclipse' 
apply plugin: 'org.springframework.boot' 

repositories { 
    mavenCentral() 
    maven { url "https://repository.jboss.org/nexus/content/repositories/releases" } 
} 

sourceCompatibility = 1.8 
targetCompatibility = 1.8 

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-data-jpa") 
    compile 'org.springframework.boot:spring-boot-configuration-processor:1.5.4.RELEASE' 
    compile("com.h2database:h2") 
} 

application.properties

spring.datasource.driverClassName = org.h2.Driver 
spring.datasource.username = sa 
spring.datasource.password = sa 

hello.Application事前

+0

これらの豆はまったく同じですが、なぜその設定が必要なのでしょうか? –

+0

私のプロダクションコードはもっと複雑です。私はそれをあまりにも単純化しました。サンプルコードを更新しました。 – cmaulini

+0

それでも、やってはいけないことをやっているように見えます。なぜこれが必要ですか?主な問題点は、URLを生成するさまざまな方法があることです。しかし、それはあなたがコードではなくconfigであるべきである。 –

答えて

0

@SpringBootApplication 
public class Application { 

    public static void main(final String[] args) { 
     final SpringApplication app = new SpringApplication(Application.class); 
     app.setAdditionalProfiles("prod"); 
     app.run(); 
    } 

    @Bean 
    @Profile("dev") 
    @ConfigurationProperties("spring.datasource") 
    public DataSource dataSourceDev() { 
     return DataSourceBuilder 
       .create() 
       .url(generateDevUrl()) 
       .build(); 
    } 

    @Bean 
    @Profile("prod") 
    @ConfigurationProperties("spring.datasource") 
    public DataSource dataSourceProd() { 
     return DataSourceBuilder 
       .create() 
       .url(generateProdUrl()) 
       .build(); 
    } 

} 

おかげで私はあなたが、これがどのように機能するかについて混乱していると思います。コードはほとんど変わらないはずです。起動時に読み込むプロファイルを定義すると、プロパティーが変わります。

application-dev.properties

spring.datasource.driverClassName = org.h2.Driver 

spring.datasource.username = saspring.datasource.password = sa spring.datasource.url=

appilication-prod.properties

spring.datasource.driverClassName = org.h2.Driverspring.datasource.username = saspring.datasource.password = sa spring.datasource.url=

データソースを設定するBeanは1つだけです。

+0

データソースはOKですが、これは良い例ではありませんでした。私の質問はもっと一般的です: 'application.properties'で定義されたいくつかのコモンプロパティと、' application-.properties'で定義されたいくつかのプロファイル固有プロパティと、プログラムされなければならないいくつかの "ランタイムプロパティ"を持つ複数のBeanを作成します。私は '@ Configuration'クラスで複数の' @ Value'タグと 'setProp()'を避けるために、 '@ ConfigurationProperties'を使用してコモンとプロファイルのプロパティを扱いたいと思います。 – cmaulini

関連する問題