ব্যবহারের স্কিমা ব্যবহার করে একটি তালিকা অটো-ওয়্যারিং NoSuchBeanDefinitionException দেয়


90

আমার একটি বিন রয়েছে যা আমি স্প্রিং ইউজন নেমস্পেস ব্যবহার করে একটি নামযুক্ত তালিকা দিয়ে ইনজেকশন করতে চাই <util:list id="myList">তবে স্প্রিং তার পরিবর্তে স্ট্রিং টাইপের মটরশুটি সংগ্রহ করতে চাইছে । আমার ভাঙ্গা পরীক্ষাটি হ'ল:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ListInjectionTest {

    @Autowired @Qualifier("myList") private List<String> stringList;

    @Test public void testNotNull() {
        TestCase.assertNotNull("stringList not null", stringList);
    }
}

আমার প্রসঙ্গে:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:util="http://www.springframework.org/schema/util"
   xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

   <util:list id="myList">
       <value>foo</value>
       <value>bar</value>
   </util:list>

</beans>

তবে আমি পেয়েছি

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [java.lang.String] found for dependency [collection of java.lang.String]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=myList)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:726)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:571)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412)

আমার যে ধরণের পাজল বরং আমি অনুভব করেছি ঠিক তেমনভাবেই এটি কাজ করা প্রত্যাশিত।

উত্তর:


171

এটি @ অটোওয়ার্ডের আচরণের একটি অস্পষ্ট অংশের কারণে, যা 3.11.2 তে নির্দিষ্ট করা হয়েছে @ স্বাক্ষরিত :

ApplicationContextক্ষেত্র বা পদ্ধতিতে টীকা যুক্ত করে যে কোনও ধরণের অ্যারের প্রত্যাশা করে ... একটি নির্দিষ্ট ধরণের সমস্ত মটরশুটি সরবরাহ করাও সম্ভব is

টাইপযুক্ত সংগ্রহের জন্য একই প্রযোজ্য ...

অন্য কথায়, বলার দ্বারা @Autowired @Qualifier("myList") List<String>, আপনি আসলে java.lang.String"বাছাইপর্বের" মাইলিস্ট " থাকা সমস্ত ধরণের মটরশুটির তালিকা আমাকে দিতে বলছেন ।

সমাধানটি 3.11.3 তে উল্লেখ করা হয়েছে বাছাইপর্বের সাথে সূক্ষ্ম-টিউনিং টিকা-ভিত্তিক অটোয়ারিং :

যদি আপনি নাম দ্বারা টিকা-চালিত ইনজেকশনটি প্রকাশ করতে চান, তবে প্রাথমিকভাবে ব্যবহার করবেন না @Autowired- এমনকি @Qualifier মানগুলির মাধ্যমে শিমের নাম উল্লেখ করতে প্রযুক্তিগতভাবে সক্ষম থাকলেও । পরিবর্তে, জেএসআর -250 @Resource টীকাটি পছন্দ করুন যা নির্দিষ্ট লক্ষ্য উপাদানটিকে তার অনন্য নাম দ্বারা সনাক্ত করার জন্য শব্দার্থগতভাবে সংজ্ঞায়িত করা হয়েছে, ঘোষিত প্রকারটি ম্যাচের প্রক্রিয়াটির জন্য অপ্রাসঙ্গিক বলে।

এই শব্দার্থক পার্থক্যের একটি নির্দিষ্ট পরিণাম হিসাবে, মটরশুটিগুলি যা সংগ্রহ বা মানচিত্রের ধরণ হিসাবে নিজেকে সংজ্ঞায়িত করা হয় সেগুলির মাধ্যমে ইনজেকশন দেওয়া যায় না @Autowiredকারণ টাইপ ম্যাচিং তাদের জন্য যথাযথভাবে প্রযোজ্য নয়। @Resourceসুনির্দিষ্ট নামে নির্দিষ্ট সংগ্রহ / মানচিত্র বিনের উল্লেখ করে এ জাতীয় শিমের জন্য ব্যবহার করুন ।

সুতরাং এটি আপনার পরীক্ষায় ব্যবহার করুন এবং এটি দুর্দান্ত কাজ করে:

@Resource(name="myList") private List<String> stringList;

9
আপনি একটি জীবন নিরাপদ এবং তাই stackoverflow.com হয়! :)
রিহার্ডস

4
আমি পারলে এই দশটি ভোট দিতাম। আপনি দা ম্যান, স্ক্যাফম্যান।
duffymo

4
এই অর্থ দ্বারা অনেকে বিভ্রান্ত হয়ে পড়েছেন অর্থার্থক সত্যই বিভ্রান্তিকর। আমি বিস্মিত এই ধরনের বিভ্রান্তিকর নকশার পিছনে কারণ কি ছিল?
সুপারটোনস্কি

4
বাহ, আমি বসন্তকে প্রোগ্রামিংয়ের অন্যতম শক্তিশালী ক্ষেত্র হিসাবে বিবেচনা করি এবং আমি আজ পর্যন্ত এই সমস্যার মুখোমুখি হই নি এবং আপনি আমাকে অনেক সময় বাঁচিয়েছিলেন। ধন্যবাদ!
আভি

4
@ রিসোর্স প্যারামিটার সমর্থন করে না বলে এটি কীভাবে কনস্ট্রাক্টর / পদ্ধতির ইনজেকশন দিয়ে কাজ করতে হয় তার জন্য কোনও পরামর্শ?
সিজেবুম

0

আর একটি জিনিস যা ঘটতে পারে তা হ'ল আপনি কোনও শিমের একটি সম্পত্তি স্বত্বপ্রদান করছেন। সেক্ষেত্রে আপনার এটির স্বায়ত্ব গ্রহণের দরকার নেই, তবে কেবল সেটার পদ্ধতি তৈরি করুন এবং বিনের সংজ্ঞা (এক্সএমএল ব্যবহার করার সময়) উদাহরণ হিসাবে সম্পত্তি ট্যাগ ব্যবহার করুন:

<bean id="cleaningUpOldFilesTasklet" class="com.example.mypackage.batch.tasklets.CleanUpOldFilesTasklet">
    <property name="directoriesToClean">
        <list>
            <value>asfs</value>
            <value>fvdvd</value>
            <value>sdfsfcc</value>
            <value>eeerer</value>
            <value>rerrer</value>
        </list>
    </property>
</bean>

এবং শ্রেণি:

public class CleanUpOldFilesTasklet extends TransferingFilesTasklet implements Tasklet{

private long pastMillisForExpiration;
private final String dateFormat = "MM.dd";
Date currentDate = null;

List<String> directoriesToClean;

public void setDirectoriesToClean(List<String> directories){
    List<String> dirs = new ArrayList<>();
    for(String directory : directories){
        dirs.add(getSanitizedDir(directory));
    }
    this.directoriesToClean = dirs;
}

দেখুন, @Autowiredক্লাসে কোনও টিকা নেই ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.