2017-03-02 7 views
7

के साथ प्राथमिक बीन वसंत ओवरराइडिंग मैं @ प्रिमिरी के उपयोग के साथ एक परीक्षण विन्यास में घोषित एक परीक्षण के दौरान एक वसंत बीन को ओवरराइड करने की कोशिश कर रहा हूं। एक घोषणा src/main/जावा पथ में है, दूसरा, प्राथमिक, src/test/जावा पथ में है।गैर प्राथमिक बीन

हालांकि, वसंत जानबूझकर प्राथमिक बीन को गैर-प्राथमिक बीन के साथ बदल रहा है, जिसे मैं परीक्षण के लिए उपयोग नहीं करना चाहता हूं। यदि मैं बस उत्पादन (src/main/java) कॉन्फ़िगरेशन बीन पर टिप्पणी करता हूं, तो यह वांछित परीक्षण कॉन्फ़िगरेशन में प्राथमिक परीक्षण (src/main/test) बीन का उपयोग करता है। (जाहिर है मैं बाहर कोड हर बार जब मैं एक परीक्षण चलाना चाहते हैं टिप्पणी नहीं कर सकता।)

लॉग से:

osbfsDefaultListableBeanFactory - एक अलग परिभाषा के साथ 'sqsConnectionFactory' सेम के लिए सेम परिभाषा ओवरराइड: की जगह [रूट बीन: कक्षा [शून्य]; स्कोप =; सार = झूठी; lazyInit = झूठी; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true प्राथमिक = सत्य; फैक्ट्रीबीननाम = testJms कॉन्फ़िगरेशन; factoryMethodName = sqsConnectionFactory; initMethodName = बातिल; destroyMethodName = (inferred); वर्ग पथ संसाधन [com/foo/विन्यास/TestJmsConfiguration.class]] के साथ

[रूट सेम: वर्ग [अमान्य] में परिभाषित किया गया; स्कोप =; सार = झूठी; lazyInit = झूठी; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true प्राथमिक = झूठा; factoryBeanName = jmsConfiguration; factoryMethodName = sqsConnectionFactory; initMethodName = बातिल; destroyMethodName = (inferred); वर्ग पथ संसाधन में परिभाषित [com/foo/विन्यास/JmsConfiguration.class]]

क्यों वसंत एक गैर प्राथमिक सेम के साथ एक प्राथमिक सेम की जगह है और कैसे मैं वसंत सेम विशेष रूप से के रूप में चिह्नित उपयोग करने के लिए करते हैं प्राथमिक बीन?

संपादित करें: src/मुख्य/जावा विन्यास:

@Configuration 
public class JmsConfiguration { 

... other bean declarations here ... 

@Bean 
public SQSConnectionFactory sqsConnectionFactory(Region region) throws JMSException { 
    return SQSConnectionFactory.builder() 
      .withRegion(region) 
      .build(); 
} 
} 

परीक्षण विन्यास:

@RunWith(SpringRunner.class) 
@SpringBootTest 
@ActiveProfiles(profiles = {"test"}) 
+0

कृपया समस्या कॉन्फ़िगरेशन और परीक्षण श्रेणी जोड़ें जिसमें समस्या है। – reos

+2

एक ही नाम के साथ एक बीन बनाने की दो अलग-अलग विधि, ताकि व्यवहार हो सके। अपने प्राथमिक बीन को एक नाम दें: @ बीन (नाम = "नामforbean") – alfcope

+0

@ आल्कोप जवाब है, धन्यवाद! यदि आप इसे उत्तर के रूप में सबमिट करते हैं तो मैं इसे सही मान दूंगा। मुझे नहीं पता कि वसंत उस व्यवहार को क्यों अनुमति देगा जब वे जानते हैं कि वे एक बीन चिह्नित प्राथमिक को बदल रहे हैं, जिसे प्राथमिक चिह्नित नहीं किया गया है। – FiguringThisOut

उत्तर

2

@Primary केवल इंजेक्शन बिंदु पर प्रभावी होता है, जब वहाँ एक संघर्ष है क्योंकि विभिन्न सेम इंजेक्शन होने की स्थिति से मेल खाते हैं, और एक निर्णय लेने की जरूरत है।

@Primary बीन्स प्रारंभिकरण में उपयोग नहीं किया जाता है। चूंकि आप एक ही बीन बनाने के दो अलग-अलग तरीकों का उपयोग कर रहे हैं, और आप उनमें से किसी का नामकरण नहीं कर रहे हैं वसंत मानते हैं कि आप इसे ओवरराइड करने का प्रयास कर रहे हैं, इसलिए यह व्यवहार हो सकता है।एक नाम दिया गया सबसे आसान समाधान है, लेकिन ध्यान रखें कि आपका संदर्भ अभी भी बीन शुरू कर रहा है जिसका आप उपयोग नहीं करना चाहते हैं।

+1

समाधान और स्पष्टीकरण के लिए धन्यवाद। – FiguringThisOut

0

:

@Configuration 
public class TestJmsConfiguration { 

@Bean(name="messageProducerMock") 
public MessageProducer mockMessageProducer() { 
    return new MessageProducerMock(); 
} 

... other bean declarations here ... 

@Bean 
@Primary 
public SQSConnectionFactory sqsConnectionFactory(@Qualifier("messageProducerMock") MessageProducer messageProducerMock) throws JMSException { 
    ... returning setup mock here 
} 
} 

परीक्षण के साथ वर्ग के साथ टिप्पणी की जाती है मुझे लगता है कि आप अपने परीक्षण में @ContextConfiguration खो सकते हैं कक्षा। परीक्षण विन्यास वर्ग के

उदाहरण (src/परीक्षण/जावा/TestConfiguration.class):

@Configuration 
@ComponentScan 
public class TestConfiguration { 
    @Bean 
    RabbitSender rabbitSender() { 
     return mock(RabbitSender.class); 
    } 

} 

परीक्षण वर्ग का उदाहरण:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = TestConfiguration.class) 
public class SomeServiceTest { 

} 
+0

वर्तमान कॉन्फ़िगरेशन प्राथमिक बीन को वांछित के रूप में लोड कर रहा है, यह केवल इतना है कि गैर-प्राथमिक बीन इसे बदल रहा है। मैन्युअल रूप से @Context कॉन्फ़िगरेशन जोड़ना क्या अलग-अलग करता है? मुझे अभी भी अन्य कॉन्फ़िगरेशन क्लास की आवश्यकता है जिसमें प्राथमिक बीन की जगह बीन शामिल है क्योंकि इसमें अन्य बीन घोषणाएं हैं। – FiguringThisOut

+0

अगर ऐसा कुछ करें, तो आपको @ प्राथमिक लिखने की आवश्यकता नहीं है। टेस्ट कॉन्फ़िगरेशन कक्षा में बीन "प्राथमिक" बीन ओवरराइड करेगा। यह एनोटेशन स्प्रिंग को बताता है कि आप विशिष्ट परीक्षण के लिए विशिष्ट कॉन्फ़िगरेशन का उपयोग करना चाहते हैं, इसलिए यह दूसरों को ओवरराइड करेगा। – hya

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