2015-01-08 13 views
5

मेरे पास एक प्रमाणीकरण सेवा है जिसे मैं रनटाइम पर स्वत: कॉन्फ़िगर करना चाहता हूं लेकिन यह विकास और परीक्षण के लिए तैयार होगा। मैं आवश्यक पैरामीटर को परिभाषित करने के लिए @ConfigurationProperties सुविधा का उपयोग करना चाहता हूं, लेकिन मुझे लाइव सेवा कॉन्फ़िगर किया गया है या नहीं, इस पर निर्भर करता है कि मुझे सशर्त रूप से सशर्त रूप से AuthenticationManager उदाहरण बनाने में सक्षम होना चाहिए।वसंत बूट सशर्त @ कॉन्फ़िगरेशनप्रॉपर्टीज

जिस दृष्टिकोण को मैं लेना चाहता हूं वह @ConditionalOnBean(AuthProperties.class) जैसे कुछ उपयोग करना है, लेकिन वसंत बूट मेरे @ConfigurationProperties कक्षा का एक बीन बनाता है चाहे गुण मौजूद हों या नहीं। मैं फ़ील्ड में सत्यापन एनोटेशन लागू कर सकता हूं, लेकिन फिर लाइव सेवा कॉन्फ़िगर नहीं होने पर संदर्भ बिल्कुल शुरू नहीं होगा।

@ConditionalOnProperty में संपत्ति नाम दोहराए बिना @ConfigurationProperties कक्षा में निर्दिष्ट गुणों को कॉन्फ़िगर करने के लिए कॉन्फ़िगरेशन अनुभाग को सशर्त बनाने का कोई साफ तरीका है?

+0

'@ कॉन्फ़िगरेशनप्रॉपर्टीज 'ऑब्जेक्ट का भी डिफ़ॉल्ट मान निर्दिष्ट करने के लिए उपयोग किया जा सकता है, जो (निश्चित रूप से)' @ ConditionalOnProperty' द्वारा नहीं उठाया जाएगा। तो यह अभी भी एक बहुत ही प्रासंगिक सवाल है। – P44T

उत्तर

0

आप बस अपने application-some_profile.properties फ़ाइल का प्रोफ़ाइल का उपयोग नहीं कर सकते हैं और फिर अपने गुण सेम सशर्त इस

@Profile("some_profile") 
@Component 
@ConfigurationProperties(prefix = "some.selector") 

public Class YourConfiguration{ 
    private property option; 
} 

की तरह जो प्रोफ़ाइल आप लाइव या नकली का चयन इस तरह से यह केवल सशर्त आधार पर बनाया जाता है बनाने । आप या तो अलग-अलग दृष्टिकोणों के लिए अपने @ कॉन्फ़िगरेशन प्रमाणीकरण कक्षाओं के लिए चयनित प्रोफ़ाइल का उपयोग कर सकते हैं या @ConditionalOnBean के साथ अनुसरण कर सकते हैं। यही प्रोफाइल है या शायद मैं इस सवाल को गलत समझा।

+1

स्प्रिंग बूट ऑटोकॉन्फिगरेशन सिस्टम का पूरा बिंदु बाह्य कॉन्फ़िगरेशन जानकारी को अनुकूलित करने के लिए है जो बिना किसी निर्दिष्ट जानकारी को अनुकूलित करता है जो केवल अनावश्यक जानकारी प्रदान करता है, अनिवार्य रूप से मिनी-प्रोफाइल। – chrylis

+0

माफ करना, मैं नोटिस नहीं किया था autoconfiguration.Nothing साफ मेरे मन @Component @ConfigurationProperties (उपसर्ग = "some.selector") @Conditional (YourConfiguration.class) सार्वजनिक कक्षा YourConfiguration लागू करता स्थिति { निजी संपत्ति विकल्प की बात आती है; \t @Override \t सार्वजनिक बूलियन मैचों (ConditionContext संदर्भ, AnnotatedTypeMetadata मेटाडाटा) { \t \t // कुछ हार्डकोडेड गुण जाँच \t वापसी (सिस्टम।getProperty ("servicedefault") == शून्य); \t} } 'साफ नहीं है, लेकिन जिस तरह से @ कोंडिडियनल काम करता है, बीन स्थिति के अनुसार पंजीकृत होगा अन्यथा पंजीकरण करने में विफल रहता है – mariubog

0

मैं एक ऐसी ही समस्या थी और मैं इस दृष्टिकोण स्प्रिंग बूट और जावा 8 का उपयोग कर उसका समाधान कर सकता है, आशा है कि यह मदद करता है किसी को:

@Configuration 
@PropertySources({ 
    @PropertySource("classpath:integration.properties"), 
    @PropertySource(value = "classpath:integration-${spring.profiles.active}.properties", ignoreResourceNotFound = true) 
}) 
@ConfigurationProperties(prefix = "integration") 
public class IntegrationProperties { 

    private String user; 

    private String password; 

    private String projectId; 

    .... 

} 

integration.properties

integration.user=User 
integration.password=Password 
integration.project-id=123 

एकीकरण -prod.properties

integration.project-id=897 

स्प्रिंग बूट गुण फ़ाइल का उपयोग करके बीन का निर्माण करेगा, और उत्पादन के लिए (प्रोफाइल prod का उपयोग करके) यह अन्य फ़ाइल का उपयोग करेगा और project-id ओवरराइड करेगा। जब आप prod प्रोफ़ाइल का उपयोग नहीं कर रहे हैं तो ignoreResourceNotFound = true स्टार्टअप पर FileNotFoundException से बच जाएगा।