2017-12-29 10 views
0

Ich versuche, eine Yml-Datei wie folgt zu lesen.@Value kann lesen, aber @ConfigurationProperties kann nicht

order: 
    foo: 5000 
    bar: 12 

und ich kann es mit @value lesen. (Ich verwende Lombok btw)

@Component 
@Data 
public class WebConfigProperty { 

    private Integer foo; 
    private Integer bar; 

    public WebConfigProperty(@Value("${order.foo}") @NonNull final Integer foo, 
      @Value("${order.bar}") @NonNull final Integer bar) { 
     super(); 
     this.foo = foo; 
     this.bar = bar; 
    } 
} 

Ich versuche @ConfigurationProperties zu verwenden, da die yml Datei mehr komplexiert sein wird. Aber es funktioniert nicht mit @ConfigurationProperties.

@Component 
@ConfigurationProperties("order") 
@Data 
public class WebConfigProperty { 

    @NonNull 
    private Integer foo; 
    @NonNull 
    private Integer bar; 
} 

Ich habe auch @EnableConfigurationProperties in einer Config-Klasse. Alle Anmerkungen in der Konfiguration sind wie folgt.

@SpringBootConfiguration 
@EnableConfigurationProperties 
@EnableAutoConfiguration(exclude = { ... }) 
@ComponentScan(basePackages = { ... }) 
@Import({ ... }) 
@EnableCaching 

Fehlermeldungen sind wie folgt.

*************************** 
APPLICATION FAILED TO START 
*************************** 

Description: 

Parameter 0 of constructor in {...}.WebConfigProperty required a bean of type 'java.lang.Integer' that could not be found. 


Action: 

Consider defining a bean of type 'java.lang.Integer' in your configuration. 

Es scheint, wie Frühling kann nicht die yml Datei finden und zu versuchen, NULL-Werte in die WebConfigProperty Felder zu setzen. Ich weiß nicht warum.

FYI, dies ist eine Multi-Projekt-Anwendung mit Gradle. Die XML-Datei und eine Konfigurationsklasse (nicht geschrieben) befinden sich im selben Projekt. WebConfigProperty ist auf einem anderen Projekt.

BEARBEITEN: Basierend auf @ Yannic Klem Antwort, diese zwei arbeiteten.

@Component 
@ConfigurationProperties("order") 
@Getter 
@Setter 
@EqualsAndHashCode 
public class WebConfigProperty { 

    @NonNull 
    private Integer foo; 
    @NonNull 
    private Integer bar; 
} 

//OR 

@Component 
@ConfigurationProperties("order") 
@Data 
@NoArgsConstructor 
public class WebConfigProperty { 

    @NonNull 
    private Integer foo; 
    @NonNull 
    private Integer bar; 
} 
+0

Ich denke, das Problem ist die '@ Data' Anmerkung. Ich habe eine Antwort gegeben, aber ich kann es im Moment nicht überprüfen. Sag mir, wenn es nicht die '@ Data' Annotation ist –

+2

Probiere' @ Getter' und '@ Setter' explizit anstelle von' @Data' – pvpkiran

+0

Könntest du es mit '@ConfigurationProperties (prefix =" order ") versuchen'? –

Antwort

2

Lomboks @Data Anmerkung fügt ein @RequiredArgsConstructor. Spring versucht dann, die Argumente an den Konstruktor zu senden.

Das verursacht Ihre Ausnahme, weil es versucht, zwei Beans des Typs Integer zu suchen: foo und bar.

@ConfigurationProperties sollte nur einen Standardkonstruktor und Getter + Setter für ihre Eigenschaften haben. Die Eigenschaften werden dann von diesen Sätzen an Ihre Klasse @ConfigurationProperties gebunden.

Ihre WebConfigProperty könnte wie folgt aussehen:

@Component 
@ConfigurationProperties("order") 
/** 
* Not sure about IDE support for autocompletion in application.properties but your 
* code should work. Maybe just type those getters and setters yourself ;) 
*/ 
@Getters 
@Setters 
public class WebConfigProperty { 

    @NonNull 
    private Integer foo; 
    @NonNull 
    private Integer bar; 
} 
+0

Es hat funktioniert. Vielen Dank. – user2652379

Verwandte Themen