2017-04-06 7 views
5

मेरे पास एक वसंत प्रोफ़ाइल "DEV" है और यह मेरे पास एकमात्र प्रोफ़ाइल है और मैं "उत्पादन" प्रोफ़ाइल नहीं बनाना चाहता हूं। तो केवल जब प्रोफ़ाइल "DEV" है, तो मुझे वसंत सुरक्षा के लिए एक निश्चित प्रकार का बीन शुरू करना होगा (जो स्मृति अतिथि उपयोगकर्ता और उपयोगकर्ता विवरण बीन में है)वसंत प्रोफ़ाइल डिफ़ॉल्ट व्यवहार

लेकिन यदि मेरे टॉमकैट स्टार्टअप में कोई वसंत प्रोफ़ाइल प्रदान नहीं की जाती है, जो उत्पादन में मामला है, मैं चाहता हूं कि मेरा ऐप जारी रहेगा जो पहले से ही कर रहा है (ldap प्रामाणिकता प्रदाता का उपयोग करके)।

क्या "डिफ़ॉल्ट" बीन व्यवहार को परिभाषित करने का कोई तरीका है जो वास्तव में स्टार्ट अप पर प्रोफ़ाइल प्रदान करने की आवश्यकता के बिना है? या आप नीचे मेरे कोड को देख सकते हैं और शायद एक अलग समाधान का सुझाव दे सकते हैं।

@Autowired 
public void configureGlobal(final AuthenticationManagerBuilder auth, final AuthenticationProvider provider) throws Exception { 

     auth 
       .eraseCredentials(false) 
       .authenticationProvider(provider) 
       .authenticationProvider(jwtConfig.jwtAuthenticationProvider()); 
} 


@Bean 
public UserDetailsService userDetailsService() { 
    final LdapUserDetailsService ldapUserDetailsService = new LdapUserDetailsService(ldapUserSearch(), ldapAuthoritiesPopulator()); 
    return new CompositeUserDetailsService(Arrays.asList(technicalUserDetailsService(), ldapUserDetailsService)); 
} 

@Bean 
@Profile("DEV") 
public UserDetailsService devUserDetailsService() { 
useAnonymous = true; 
     InMemoryUserDetailsManagerBuilder b = new InMemoryUserDetailsManagerBuilder() 
       .withUser("user").password("password").authorities(ROLE_USER, ROLE_ADMIN).and(); 

     return new CompositeUserDetailsService(Arrays.asList(b.build(), 
       technicalUserDetailsService())); 

} 
@Bean 
public AuthenticationProvider ldapAuthenticationProvider() { 
    final BindAuthenticator ba = new BindAuthenticator((BaseLdapPathContextSource) contextSource()); 
    ba.setUserSearch(ldapUserSearch()); 
    return new LdapAuthenticationProvider(ba, ldapAuthoritiesPopulator()); 
} 
+0

क्या आपने इसे पहले से ही आजमाया था? यदि हां, तो क्या कुछ गलत हो गया? – john16384

+0

केवल बीन को परिभाषित करके और प्रोफ़ाइल सक्रिय होने पर इसे ओवरराइड करें ...डब्ल्यू जो मूल रूप से डिफ़ॉल्ट व्यवहार है। –

उत्तर

6

मुझे लगता है कि @Profile क्या करता है इसकी गलतफहमी है। @Profile के साथ चिह्नित बीन्स केवल तब लोड होते हैं जब वह प्रोफ़ाइल सक्रिय होती है, लेकिन अन्य सभी बीन्स (@Profile के बिना) अभी भी चुनी हुई प्रोफ़ाइल के बावजूद हमेशा लोड होते हैं।

1) मार्क साथ @Primary तो वसंत जानता है जो एक जब एक ही प्रकार के दो सेम लोड किए गए हैं लेने के लिए (के बाद से आप चाहते हैं donot एक @Profile("dev") भी साथ उन सभी सेम:

मैं इस को हल करने के लिए कुछ तरीके को देखने के एक उत्पादन प्रोफाइल का उपयोग करने के लिए)।

2) सेम नहीं जब प्रोफ़ाइल देव @Profile("!dev") साथ सक्रिय है लोड किया जाना चाहिए कि मार्क - स्प्रिंग 3.2 के लिए ही लागू है और उच्च (https://github.com/spring-projects/spring-framework/commit/bcd44f3798ed06c0704d2a3564b8a9735e747e87 देखें)।

या ...

3) एक उत्पादन प्रोफ़ाइल का उपयोग करें और बस इसे उदाहरण के लिए में सक्रिय web.xml फ़ाइल (कुछ जो आप शायद स्थानीय रूप से उपयोग न करें)।

बस एकाधिक @Configuration कक्षाएं बनाएं और संपूर्ण कक्षा को प्रोफ़ाइल के साथ चिह्नित करें (यह संबंधित सामग्री को एक साथ रखने में भी मदद करता है)। डेटाबेस के लिए एक सामान्य उदाहरण है। उत्पादन डेटाबेस (जेएनडीआई और ओरेकल के साथ कुछ) और स्थानीय विकास और परीक्षण (एचएसक्यूएलडीबी) के लिए एक कॉन्फ़िगरेशन क्लास बनाएं।

आप @Profile("production") साथ JNDI विन्यास वर्ग और @Profile("dev") के साथ अन्य निशान - व्यक्तिगत सेम चिह्नित करने के लिए कोई ज़रूरत नहीं, बस उन्हें तार्किक विभाजित दो अलग @Configuration वर्गों के बीच।

यह एकीकरण परीक्षण के साथ संयुक्त होने पर भी हमारे लिए वास्तव में अच्छा काम करता है।

+0

tnx, आपका पहला समाधान सही सेम चुनने के लिए ठीक काम करता प्रतीत होता है, लेकिन किसी भी तरह से मैं अभी भी अपने अतिथि उपयोगकर्ता के साथ लॉगिन नहीं कर सकता। "dev.userDetailsService (userDetailsService())" का उपयोग करने का कोई तरीका है "जब यह dev प्रोफाइल है और" auth.authenticationProvider (प्रदाता) "जब देव नहीं है? जो कि मेरे उदाहरण – Spring

+0

में पहली विधि में कॉन्फ़िगर किया गया है, यह उत्तर देने के लिए थोड़ा अपूर्ण है ... हालांकि, मुझे लगता है कि आपको केवल दो 'प्रमाणीकरण प्रबंधक' बीन्स बनाना चाहिए, एक 'देव' प्रोफ़ाइल वाला और एक बिना (या '! dev')। उन दो तरीकों से आप प्रोफाइल के अनुसार अलग-अलग बीन का निर्माण कर सकते हैं। – john16384

+0

धन्यवाद। बीटीडब्ल्यू प्राथमिक एनोटेशन ने मेरे लिए काम नहीं किया और मैंने "! DEV" वाक्यविन्यास – Spring

1

मैं इस तरह से सेम परिभाषा ओवरराइड होगा: इस तरह

@Autowired 
public void configureGlobal(final AuthenticationManagerBuilder auth, final AuthenticationProvider provider) throws Exception { 

     auth 
       .eraseCredentials(false) 
       .authenticationProvider(provider) 
       .authenticationProvider(jwtConfig.jwtAuthenticationProvider()); 
} 


@Bean("myUserDetailService") 
public UserDetailsService userDetailsService() { 
    final LdapUserDetailsService ldapUserDetailsService = new LdapUserDetailsService(ldapUserSearch(), ldapAuthoritiesPopulator()); 
    return new CompositeUserDetailsService(Arrays.asList(technicalUserDetailsService(), ldapUserDetailsService)); 
} 

@Bean("myUserDetailService") 
@Profile("DEV") 
public UserDetailsService devUserDetailsService() { 
useAnonymous = true; 
     InMemoryUserDetailsManagerBuilder b = new InMemoryUserDetailsManagerBuilder() 
       .withUser("guest").password("guest").authorities(ROLE_USER, ROLE_ADMIN).and(); 

     return new CompositeUserDetailsService(Arrays.asList(b.build(), 
       technicalUserDetailsService())); 

} 
@Bean("myAuthProvider") 
public AuthenticationProvider ldapAuthenticationProvider() { 
    final BindAuthenticator ba = new BindAuthenticator((BaseLdapPathContextSource) contextSource()); 
    ba.setUserSearch(ldapUserSearch()); 
    return new LdapAuthenticationProvider(ba, ldapAuthoritiesPopulator()); 
} 

@Bean("myAuthProvider") 
@Profile("DEV") 
public AuthenticationProvider devAuthenticationProvider() { 

    //find a way to return userdetails here 

} 

जब "देव" प्रोफ़ाइल सेम कि प्रोफाइल में परिभाषित करना शुरू कर दिया है डिफ़ॉल्ट सेम ओवरराइड करना चाहिए

निश्चित रूप से जब आप बीन्स को स्वचालित करते हैं तो आपको @Qualifier एनोटेशन

का उपयोग करना चाहिए, मुझे उम्मीद है कि यह उपयोगी है

एंजेलो

संबंधित मुद्दे