29

मिला है मैं एक वेबपैप के लिए वसंत का उपयोग करके कुछ सेम (निर्भरता इंजेक्शन के लिए) को स्वचालित करने की कोशिश कर रहा हूं। एक नियंत्रक बीन में एक और बीन होता है जो बदले में बीन्स के दूसरे सेट का हैशपैप रखता है। अभी के लिए मानचित्र में केवल एक प्रविष्टि है। जब मैं बिल्ला में चलाने के लिए और सेवा को कॉल मैं कह रही है कि दूसरे सेम (नियंत्रक में आयोजित) अद्वितीय नहीं हैअद्वितीय बीन्स के साथ वसंत ऑटोवॉयरिंग: वसंत की उम्मीद एकल मिलान बीन लेकिन 2

No unique bean of type [com.hp.it.km.search.web.suggestion.SuggestionService] is defined: expected single matching bean but found 2: [suggestionService, SuggestionService] 

मुझे नजर नहीं आता है, जहां मैं सेम को परिभाषित कर रहा हूँ कर सकते हैं दो बार हालांकि वसंत और करने के लिए नया हूँ कोई त्रुटि मिलती है ऑटोवॉयरिंग इसलिए मुझे कुछ मौलिक याद आ रही है। एक्सएमएल और नीचे सूचीबद्ध 2 वर्ग के लिए स्रोत कोड ...

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:context="http://www.springframework.org/schema/context"  xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

<context:component-scan base-package="com.hp.it.km.search.web.suggestion" /> 
<mvc:annotation-driven /> 
<context:annotation-config /> 

<bean id="SuggestionController" class="com.hp.it.km.search.web.suggestion.SuggestionController"> 
    <property name="service"> 
     <ref bean="SuggestionService" /> 
    </property> 
</bean> 

<bean id="SuggestionService" class="com.hp.it.km.search.web.suggestion.SuggestionService"> 
    <property name="indexSearchers"> 
     <map> 
      <entry key="KMSearcher"> <ref bean="KMSearcherBean"></ref></entry> 
     </map> 
    </property> 
</bean> 

<bean id="KMSearcherBean" class="com.hp.it.km.search.web.suggestion.SuggestionIndexSearcher"> 
     <constructor-arg index="0" value="KMSearcher" /> 
     <constructor-arg index="1" value="C://dev//workspace//search-restful-webapp//src//main//resources//indexes//keyword" /> 
</bean> 

autowired नियंत्रक और सेवा की फलियों के साथ वर्ग asscoaites यहाँ हैं ...

@Controller 
public class SuggestionController { 
private SuggestionService service; 

@Autowired 
public void setService(SuggestionService service) { 
    this.service = service; 
} 

public SuggestionService getService() { 
    return service; 
} 

और ...

@Component 
public class SuggestionService { 

private Map<String, IndexSearcher> indexSearchers = new HashMap<String,  IndexSearcher>(); 

@Autowired 
public void setIndexSearchers(Map<String, IndexSearcher> indexSearchers) { 
    this.indexSearchers = indexSearchers; 
} 

    public SuggestionService() { 
    super(); } 

कृपया मदद करें!

उत्तर

40

मुद्दा है, क्योंकि आप एक है @Component एनोटेशन के माध्यम से और XML कॉन्फ़िगरेशन के माध्यम से सुझाए गए सुझाव सेवा का बीन। जेबी निजेट द्वारा समझाया गया है, इससे @ बीओम्पोनेंट के माध्यम से बनाए गए नाम 'सुझाव सेवा' के साथ एक बीन का निर्माण होगा और दूसरा एक्सएमएल के माध्यम से बनाए गए 'सुझाव सेवा' नाम के साथ होगा।

जब आप @Autowired द्वारा SuggestionService उल्लेख डिफ़ॉल्ट रूप से आपके नियंत्रक, स्प्रिंग autowires "प्रकार से" में, और प्रकार के दो सेम लगता है 'SuggestionService'

आप कर सकता है निम्नलिखित

  1. निकालें @ आपकी सेवा से घटक और एक्सएमएल के माध्यम से मैपिंग पर निर्भर करता है - सबसे आसान
  2. एक्सएमएल से सुझाव सेवा निकालें और निर्भरताओं को स्वचालित करें - उपयोग का उपयोग करें: इंडेक्स को इंजेक्ट करने के लिए मानचित्र खोजकर्ता मानचित्र।
  3. बीन को इसके नाम से चुनने के लिए @Autowired के बजाय @Resource का उपयोग करें।

    @Resource("suggestionService") 
    private SuggestionService service; 
    

या

@Resource("SuggestionService") 
    private SuggestionService service; 

दोनों तीसरे work.The चाहिए एक गंदा ठीक है और यह अन्य तरीकों के माध्यम से सेम संघर्ष को हल करने के लिए सबसे अच्छा है।

+0

शानदार मैं बस सेवा वर्ग से घटक हटा दिया। फिर नियंत्रक को दो बार पंजीकृत होने के बारे में एक त्रुटि मिली और इस समाधान के अनुसार घटक स्कैन को हटाकर इसके आसपास हो गया http://stackoverflow.com/a/4804417/491196 आपकी मदद के लिए धन्यवाद –

5

यदि मुझे गलत नहीं है, तो @ कॉम्पोनेंट के साथ घोषित एक बीन का डिफ़ॉल्ट बीन नाम अपने वर्ग का नाम लोअर-केस में पहला अक्षर है। इसका मतलब है कि

@Component 
public class SuggestionService { 

प्रकार SuggestionService की एक सेम वाणी है, और नाम suggestionService की। ,

<bean id="SuggestionService" class="com.hp.it.km.search.web.suggestion.SuggestionService"> 
    ... 
</bean> 

तो या तो: यह

@Component("suggestionService") 
public class SuggestionService { 

करने के लिए या आप एक ही प्रकार का एक और सेम को पुनर्परिभाषित कर रहे हैं

को
<bean id="suggestionService" .../> 

बराबर है, लेकिन एक अलग नाम के साथ, एक्सएमएल में SuggestionService होने के लिए एनोटेशन में बीन का नाम निर्दिष्ट करें, या एक्सएमएल में आईडी suggestionService का उपयोग करें (<ref> तत्व को संशोधित करने के लिए भी मत भूलना, या इसे हटाने के लिए, चूंकि इसकी आवश्यकता नहीं है)। इस मामले में, एक्सएमएल परिभाषा एनोटेशन परिभाषा को ओवरराइड कर देगी।

+0

खेद मैं काफी का पालन न हल इस्तेमाल किया। "@ कॉम्पोनेंट पब्लिक क्लास सुझाव सेवा {" और एक्सएमएल में बीन दो बीन्स घोषित क्यों करता है? –

+0

आपकी आखिरी वाक्य पर आप कहते हैं कि "सुझाव सेवा के लिए एनोटेशन में बीन का नाम निर्दिष्ट करें" क्या यह मेरे पास नहीं है? मैंने एक्सएमएल बीन परिभाषा को कम मामला बदलने की कोशिश की लेकिन समस्या बनी रही। आपकी मदद के लिए Thansk :) –

+0

मेरे संपादन इसे स्पष्ट करना चाहिए। –

13

यदि आपके पास एक वर्ग के स्वामित्व वाले एक ही वर्ग के 2 सेम हैं, तो आप @Qualifier (Spring Autowiring @Qualifier example) का उपयोग करते हैं।

लेकिन ऐसा लगता है कि आपकी समस्या गलत जावा सिंटेक्स से आती है।

आपका वस्तु लोअर केस अक्षर से शुरू कर देना चाहिए

SuggestionService suggestion; 

आपका सेटर के रूप में अच्छी तरह से छोटे अक्षर के साथ शुरू और नाम आपत्ति चाहिए अपर केस के साथ होना चाहिए

public void setSuggestion(final Suggestion suggestion) { 
    this.suggestion = suggestion; 
} 
+0

सेटर नाम और पूंजीकरण के बारे में आपका अधिकार। इसे काम करने के लिए इसके साथ झुकाव के दौरान मैंने इसे गलत तरीके से बदल दिया होगा। दुर्भाग्य से यह समस्या प्रतीत नहीं होती है। मैंने उपरोक्त प्रश्न को सही सेटर के साथ अपडेट किया है। –

6

मेरे लिए यह एक ही इंटरफ़ेस को लागू करने वाले दो सेम होने का मामला था। यूनिट टेस्ट के लिए एक नकली प्रतिबंध था जो मूल बीन के साथ संघर्ष कर रहा था। अगर हम का उपयोग

@component ("suggestionServicefake")

, यह अभी भी suggestionService साथ संदर्भ। तो मैं @component हटा दिया और केवल

@Qualifier ("suggestionServicefake")

जो समस्या अपने पहले वाक्य अपने एक छोटे से strangly लिखा

+0

वही अगर आप @SpringBootTest संपत्ति का उपयोग करते हैं (कक्षाएं = सुझाव सेवा.क्लास) अपनी परीक्षा कक्षा में। – DocDbg

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