2017-05-11 20 views
4

私はSpringbootを初めて使用しています。これは私が解決しようとしている問題です。 私は次のプロパティを持つapplication.ymlファイルました:私は、コードを使用してKinesisSenderFeatureの値にアクセスしようとしたSpringboot yaml設定がブール値を読み取らない

kinesis: 
    streaming: 
     client: 
      featuretoggle: 
       kinesisSenderFeature: true 

を:

@Value("${kinesis.streaming.client.featuretoggle.kinesisSenderFeature}") 
private boolean featureToggle; 

など

@Value("${kinesis.streaming.client.featuretoggle.kinesisSenderFeature}") 
private Boolean featureToggle; 

PropertySourcesPlaceholderConfigurer Beanは、次のように定義されます。

@Bean 
    @Primary 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); 
     YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean(); 
     yaml.setResources(new ClassPathResource("application.yml")); 
     propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject()); 
     return propertySourcesPlaceholderConfigurer; 
    } 

私が構築しようとした際、ApplicaitonContextは、次のエラーでロードに失敗する:私は奇妙見つける何

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'rabbitMessageConsumer': Unsatisfied dependency expressed through field 'featureToggle'; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${kinesis.streaming.client.featuretoggle.kinesisSenderFeature}] 

が、文字列を変換しようとしている、次のとおりです。[$ {kinesis.streaming.client.featuretoggle .kinesisSenderFeature}]をブール値に変換すると、yamlファイルからプロパティの値を読み取ることはできません。

はい、私は見ました:

これは単なるブールフラグであるように私は、このプロパティの周りにBeanを作成する必要はありません。

注:@Valueに:defaultを入れた場合、ビルドは成功しますが、yamlからの読み込みに失敗し、既定値になっているためだと思います。

@Value("${kinesis.streaming.client.featuretoggle.kinesisSenderFeature:false}") 
private boolean featureToggle; 

注:コメントで@Andreasで指摘したように、私は動作しませんでしたそれでも

//In application.yml 
kinesisSenderFeature:false 

//In code 
@Value("${kinesisSenderFeature}") 
private boolean featureToggle; 

を与えてみました。しかし、問題なくyamlから読み込まれる他のプロパティがあります。これはsrc/main/resourcesにある標準のapplication.ymlです。私はこれがデフォルトで読み込まれるべきだと思いますか?

ご協力いただきますようお願い申し上げます。ありがとう!

+1

*問題を調べるために、単純な 'abc:true'プロパティを定義して使ってみましたか?あなたが知っているのは、そのファイルからプロパティが読み込まれているかどうかです。 – Andreas

+0

それを指摘していただきありがとうございます。いいえ、うまくいきませんでした。それに応じて質問を編集します。 – Jeevs

+1

PropertySourcesPlaceholderConfigurer beanなしで試しましたか?私はこのBeanを削除して、SpringからのデフォルトのPropertyReaderが適切にそれをピックアップするかどうかを確認します。 – pvpkiran

答えて

2

@pvpKiranが指摘したように、PropertySourcesPlaceholderConfigurerは必要ありません。 application.ymlをクラスパスに置くだけで、Spring BootはそれをピックアップしてBooleanの値を割り当てます。魅力のように動作し、Spring Boot 1.5.2でテストしました。

+0

ありがとうPJ、それが修正されました。私はそれを工学的に過ぎたと思う。 – Jeevs

関連する問題