2015-02-12 4 views
9

से गुण को पुन: प्राप्त नहीं मैं वसंत बूट 1.2.1 का उपयोग कर रहा है और इसलिए की तरह मान्यता के साथ एक @ConfigurationProperties सेम बनाने का प्रयास कर:स्प्रिंग बूट @ConfigurationProperties पर्यावरण

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

वर्ग आवेदन bootstrap के लिए है:

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

मैं कोशिश करते हैं और इस आवेदन मैं निम्न अपवाद ढेर प्राप्त शुरू करते हैं:

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 

आप setEnvironment विधि में देख ऊपर मैं url संपत्ति मान्य करने के लिए है कि यह Environment का हिस्सा है और यह अपवाद से पहले प्रदर्शित किया जाता है लॉगिन कर रहा हूं सकते हैं:

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

url संपत्ति application.properties फ़ाइल से खींचा जाता है src/main/resources में। फ़ाइल की सामग्री हैं:

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

क्या डेटाबेंडर 'लक्ष्य प्रकार के रूप में' URL' का समर्थन करता है? यदि आप फ़ील्ड प्रकार को 'स्ट्रिंग' में बदलते हैं तो क्या होता है? – chrylis

उत्तर

20

आपके बीन में कोई सेटटर नहीं है। एक सेटर जोड़ें।

+0

वह था। धन्यवाद! – Centinul

+0

क्या मुझे दस्तावेज में मौका मिला था? यदि हां, तो क्या आप मुझे स्थान पर इंगित कर सकते हैं? – Centinul

3

यह स्पष्ट रूप से यहाँ लिखा है: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties

getters और setters आमतौर पर अनिवार्य हैं, बाध्यकारी के बाद से सिर्फ वसंत MVC में की तरह, मानक जावा बीन्स संपत्ति वर्णनकर्ता के माध्यम से है। ऐसे मामले हैं जहां एक सेटर छोड़ा जा सकता है: मैप्स, जब तक उन्हें प्रारंभ किया जाता है, उन्हें गेटटर की आवश्यकता होती है लेकिन जरूरी नहीं कि एक सेटर नहीं है क्योंकि उन्हें बांधने की मशीन द्वारा उत्परिवर्तित किया जा सकता है। संग्रह और सरणी या तो एक इंडेक्स (आमतौर पर वाईएएमएल के साथ) या एकल अल्पविराम से अलग मूल्य (गुण) का उपयोग करके पहुंचा जा सकता है। बाद के मामले में, एक सेटटर अनिवार्य है। हम हमेशा इस तरह के प्रकार के लिए एक सेटटर जोड़ने की सलाह देते हैं। यदि आप संग्रह प्रारंभ करते हैं, तो सुनिश्चित करें कि यह अपरिवर्तनीय नहीं है (जैसा कि ऊपर दिए गए उदाहरण में है) यदि नेस्टेड पीओजेओ गुण प्रारंभ किए गए हैं (ऊपर दिए गए उदाहरण में सुरक्षा फ़ील्ड की तरह), तो एक सेटटर की आवश्यकता नहीं है। यदि आप बाइंडर को अपने डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करके ऑन-द-फ्लाई उदाहरण बनाना चाहते हैं, तो आपको एक सेटर की आवश्यकता होगी। कुछ लोग स्वचालित रूप से गेटर्स और सेटर्स जोड़ने के लिए प्रोजेक्ट लंबोक का उपयोग करते हैं। सुनिश्चित करें कि लंबोक इस तरह के किसी भी विशेष निर्माता को उत्पन्न नहीं करता है क्योंकि यह ऑब्जेक्ट को तुरंत चालू करने के लिए कंटेनर द्वारा स्वचालित रूप से उपयोग किया जाएगा।