2015-02-12 12 views
9

özelliklerin alınması değil:Bahar Önyükleme @ConfigurationProperties Spring Önyükleme 1.2.1 kullanıyorum ve şöyle doğrulama ile bir <code>@ConfigurationProperties</code> fasulye oluşturmaya çalışıyorum Çevre

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

uygulamayı bootstrap sınıftır:

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")); 
    } 
} 

denemek ve aşağıdaki özel durum yığını almak bu uygulamayı başlattığınızda:

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 

Ben Environment parçası ve istisna önce görüntülendiğini doğrulamak için url özelliğini giriş ediyorum Yukarıdaki setEnvironment yönteminde görebileceğiniz gibi: url mülkiyet application.properties dosyadan çekilir

. ____   _   __ _ _ 
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \ 
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 
\\/ ___)| |_)| | | | | || (_| | )))) 
    ' |____| .__|_| |_|_| |_\__, |//// 
=========|_|==============|___/=/_/_/_/ 
:: 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 

src/main/resources. Dosyanın içeriği:

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

'DataBinder' URL'yi bir hedef tür olarak destekliyor mu? Alan türünü "String" olarak değiştirirseniz ne olur? – chrylis

cevap

20

Fasulyenizde ayartıcı yoktur. Bir setter ekleyin.

+0

O kadardı. Teşekkür ederim! – Centinul

+0

dokümantasyonda şans eseri kaçırdım mı? Eğer öyleyse, beni yere yönlendirebilir misin? – Centinul

3

Açıkça burada yazılanlardan: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties

Alıcılar ve ayarlayıcılar genellikle zorunludur, bağlayıcı beri sadece Bahar MVC gibi standart Java Fasulye mülkiyet tanımlayıcıları üzerinden gerçekleştirilir. Bir ayarlayıcının ihmal edilebileceği durumlar vardır: Haritalar, başlatıldıkları sürece bir bağlayıcıya ihtiyaç duyarlar, ancak bağlayıcı tarafından mutasyona uğrayabilecekleri için bir ayarlayıcıya gerek yoktur. Koleksiyonlar ve diziler bir dizinden (genellikle YAML ile) veya tek bir virgülle ayrılmış değer (özellikler) kullanılarak erişilebilir. İkinci durumda, bir setter zorunludur. Bu tür tipler için daima bir setter eklemenizi öneririz. Bir koleksiyonu başlatırsanız, (yukarıdaki örnekte olduğu gibi) değişmez olmadığından emin olun. İç içe geçmiş POJO özellikleri başlatıldıysa (yukarıdaki örnekte Güvenlik alanı gibi), bir ayarlayıcı gerekli değildir. Bağlayıcının varsayılan yapıcısını kullanarak anında örnek oluşturmasını isterseniz, bir ayarlayıcıya ihtiyacınız olacaktır. Bazı kişiler, alıcıları ve ayarlayıcıları otomatik olarak eklemek için Project Lombok'u kullanır. Lombok, nesneyi başlatmak için kapsayıcı tarafından otomatik olarak kullanılacak türden herhangi bir özel oluşturucu oluşturmadığından emin olun.

İlgili konular