2015-02-12 6 views
9

ich mit Spring-Boot 1.2.1 und versuche, eine @ConfigurationProperties Bean mit Validierung erstellen wie folgt:Frühling Stiefel @ConfigurationProperties nicht Eigenschaften von Umwelt Abrufen

package com.sampleapp; 

import java.net.URL; 

import javax.validation.constraints.NotNull; 

import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.stereotype.Component; 

@Component 
@ConfigurationProperties 
public class SampleAppProperties { 
    @NotNull 
    private URL url; 

    public URL getUrl() { 
     return url; 
    } 
} 

Die Klasse, die Anwendung Bootstrap ist:

package com.sampleapp; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 
import org.springframework.context.EnvironmentAware; 
import org.springframework.core.env.Environment; 

@SpringBootApplication 
@EnableConfigurationProperties 
public class SampleApplication implements EnvironmentAware { 
    private static Logger LOGGER = LoggerFactory.getLogger(SampleApplication.class); 

    public static void main(String[] args) { 
     SpringApplication.run(SampleApplication.class, args); 
    } 

    @Override 
    public void setEnvironment(Environment environment) { 
     LOGGER.info("URL = {}", environment.getRequiredProperty("url")); 
    } 
} 

Wenn ich versuche, und starten Sie diese Anwendung ich die folgende Ausnahme-Stack erhalten:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sampleAppProperties': Could not bind properties to [unknown] (target=, ignoreInvalidFields=false, ignoreUnknownFields=true, ignoreNestedProperties=false); nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'target' on field 'url': rejected value [null]; codes [NotNull.target.url,NotNull.url,NotNull.java.net.URL,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.url,url]; arguments []; default message [url]]; default message [may not be null] 
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:303) 
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:250) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1558) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:961) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:950) 
    at com.sampleapp.SampleApplication.main(SampleApplication.java:17) 
Caused by: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'target' on field 'url': rejected value [null]; codes [NotNull.target.url,NotNull.url,NotNull.java.net.URL,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.url,url]; arguments []; default message [url]]; default message [may not be null] 
    at org.springframework.boot.bind.PropertiesConfigurationFactory.validate(PropertiesConfigurationFactory.java:294) 
    at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:253) 
    at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:225) 
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:296) 
    ... 17 common frames omitted 

Wie können Sie in der setEnvironment Methode siehe oben ich die url Eigenschaft bin Anmeldung zu bestätigen, dass es einen Teil der Environment ist, und es wird vor der Ausnahme angezeigt:

. ____   _   __ _ _ 
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \ 
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 
\\/ ___)| |_)| | | | | || (_| | )))) 
    ' |____| .__|_| |_|_| |_\__, |//// 
=========|_|==============|___/=/_/_/_/ 
:: Spring Boot ::  (v1.2.1.RELEASE) 

2015-02-12 12:32:01.384 INFO 5608 --- [   main] c.s.SampleApplication     : Starting SampleApplication on VDDK03E-14FB6E5 with PID 5608 (D:\projects\onboarding-parser\target\classes started by ..... 
2015-02-12 12:32:01.509 INFO 5608 --- [   main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]3252ac20: startup date [Thu Feb 12 12:32:01 EST 2015]; root of context hierarchy 
2015-02-12 12:32:03.040 INFO 5608 --- [   main] c.s.SampleApplication     : URL = http://www.joe.com 
2015-02-12 12:32:03.378 ERROR 5608 --- [   main] o.s.b.b.PropertiesConfigurationFactory : Properties configuration failed validation 
2015-02-12 12:32:03.378 ERROR 5608 --- [   main] o.s.b.b.PropertiesConfigurationFactory : Field error in object 'target' on field 'url': rejected value [null]; codes [NotNull.target.url,NotNull.url,NotNull.java.net.URL,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.url,url]; arguments []; default message [url]]; default message [may not be null] 
2015-02-12 12:32:03.394 WARN 5608 --- [   main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt 

Die url Eigenschaft aus der application.properties Datei gezogen wird in src/main/resources. Der Inhalt der Datei lautet:

url=http://www.joe.com 
+0

Unterstützt 'DataBinder'' URL' als Zieltyp? Was passiert, wenn Sie den Feldtyp in 'String' ändern? – chrylis

Antwort

20

Es gibt keinen Setter in Ihrer Bean. Fügen Sie einen Setter hinzu.

+0

Das war es. Vielen Dank! – Centinul

+0

habe ich zufällig in der Dokumentation vermisst? Wenn ja, könnten Sie mich auf den Standort verweisen? – Centinul

3

Es ist hier klar geschrieben: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties

Getter und Setter sind in der Regel obligatorisch, ist über Standard-Java Beans Eigenschaftendeskriptoren, genau wie in Spring MVC seit verbindlich. Es gibt Fälle, in denen ein Setter weggelassen werden kann: Karten, so lange sie initialisiert werden, benötigen einen Getter, aber nicht unbedingt einen Setter, da sie vom Binder mutiert werden können. Auf Sammlungen und Arrays kann entweder über einen Index zugegriffen werden (normalerweise mit YAML) oder mit einem einzelnen durch Kommas getrennten Wert (Eigenschaften). Im letzteren Fall ist ein Setter obligatorisch. Wir empfehlen, für diese Typen immer einen Setter hinzuzufügen. Wenn Sie eine Sammlung initialisieren, stellen Sie sicher, dass sie nicht unveränderbar ist (wie im obigen Beispiel). Wenn verschachtelte POJO-Eigenschaften initialisiert werden (wie im obigen Beispiel das Feld "Sicherheit"), ist kein Setter erforderlich. Wenn Sie möchten, dass die Sammelmappe die Instanz mithilfe des Standardkonstruktors on-the-fly erstellt, benötigen Sie einen Setter. Einige Leute verwenden Project Lombok, um Getter und Setter automatisch hinzuzufügen. Stellen Sie sicher, dass Lombok für diesen Typ keinen bestimmten Konstruktor generiert, da dieser automatisch vom Container zur Instanziierung des Objekts verwendet wird.

Verwandte Themen