2017-05-11 3 views
4

Ich bin neu bei Springboot. Das ist das Problem, das ich versuche zu lösen. Ich habe eine application.yml Datei mit folgenden Eigenschaft:Springboot yaml config nicht lesen boolean

kinesis: 
    streaming: 
     client: 
      featuretoggle: 
       kinesisSenderFeature: true 

Ich habe versucht, den Wert des KinesisSenderFeature mit dem Code zuzugreifen:

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

sowie

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

Die PropertySourcesPlaceholderConfigurator-Bean ist definiert als:

@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; 
    } 

Wenn ich zu bauen versuchen, nicht ApplicaitonContext mit dem folgenden Fehler laden:

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}] 

Was finde ich seltsam, es versucht, die Zeichenfolge zu konvertieren: [$ {kinesis.streaming.client.featuretoggle .kinesisSenderFeature}] in einen booleschen Wert, und ich glaube - liest nicht den Wert der Eigenschaft aus der Yaml-Datei.

Ja, ich habe:

Ich will nicht eine Bohne, um dieses Objekt zu schaffen, wie dies nur ein boolean-Flag .

Hinweis: Wenn ich ein: default in den @ Value, der Build erfolgreich- aber ich glaube, das ist nur, weil das Lesen von Yaml fehlgeschlagen, und standardmäßig mit dem Wert, den ich gab.

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

Hinweis: Wie @Andreas im Kommentar erwähnt, habe ich versucht, auch

//In application.yml 
kinesisSenderFeature:false 

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

geben, die nicht funktioniert hat. Aber es gibt andere Eigenschaften, die ohne Probleme vom Yaml gelesen werden. Es ist die Standard-application.yml in src/main/resources, von der ich glaube, dass sie standardmäßig gelesen werden sollte.

Jede Hilfe wird sehr geschätzt. Vielen Dank!

+1

Um * das Problem * zu erforschen, haben Sie versucht, eine einfache 'abc: true'-Eigenschaft zu definieren und diese zu verwenden? Sie wissen, ob eine Eigenschaft aus dieser Datei gelesen wird. – Andreas

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Nein, auch das hat nicht funktioniert. Ich werde die Frage entsprechend bearbeiten. – Jeevs

+1

Haben Sie versucht, ohne PropertySourcesPlaceholderConfigurer Bean. Ich meine, entfernen Sie diese Bohne und sehen Sie, ob der Standard PropertyReader von Spring es richtig aufnimmt – pvpkiran

Antwort

2

Wie @pvpkiran darauf hingewiesen, benötigen Sie nicht die PropertySourcesPlaceholderConfigurer. Setzen Sie einfach den application.yml auf den Klassenpfad, Spring Boot hebt es auf und weist den Boolean Wert zu. Funktioniert wie ein Zauber, nur getestet mit Spring Boot 1.5.2.

+0

Danke PJ, das hat es behoben. Ich glaube, ich habe es übertrieben. – Jeevs