SORU
1 EYLÜL 2009, Salı


Otomatik kablo Listesi açıklama kullanarak şema NoSuchBeanDefinitionException verir

Adında bir listesi <util:list id="myList"> İlkbahar türü Dize fasulye koleksiyonu için yerine arıyor ad Bahar açıklama kullanarak enjekte etmek istediğim bir fasulye var. Benim kırık testi:

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

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

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

İçeriği:

<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>

Ama olsun

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)

Bu iş için bekleniyordu yol olacağını düşündüm benim gibi çok Bulmaca.

CEVAP
1 EYLÜL 2009, Salı


Bu @Autowired davranışlarının oldukça karanlık bir bölüm, 3.11.2. @Autowired belirtilen kaynaklanmaktadır:

Aynı zamanda bütün sağlamaktır bu belirli bir tür fasulye Ekleyerek ApplicationContext alan ya da yönteme Açıklama Bu beklediği türden bir dizi...

Aynı yazılan koleksiyonları için geçerlidir...

@Autowired @Qualifier("myList") List<String> aslında istiyorsun diyerek başka bir deyişle, "beni niteleyici türü java.lang.String tüm fasulye listesini ver "". myList

Çözüm 3.11.3. Fine-tuning annotation-based autowiring with qualifiers söz edilir:

Eğer ifade etmek istiyorsanız adı açıklama tahrikli enjeksiyon, öncelikle @Autowired - bile kullanmayın başvuran yetenekli ise @Qualifierfasulye bir isim değerler. Bu genel amaçlı-250 tercih ederim bunun yerine Olan @Resource açıklama anlamsal bir tanımlamak için tanımlanan onun tarafından belirli bir hedef bileşeni benzersiz bir ad, ilan türü ile varlık eşleştirme için alakasız süreç.

Bu belirli bir sonucu olarak semantik fark, hangi fasulye bir topluluk olarak kendilerini tanımlanan veya harita türü ile enjekte edilemez Uyumu olmadığından @Autowired kendileri için geçerli olan düzgün.Kullanın 15* *böyle fasulye için atıfta özel koleksiyon göster bean/ benzersiz bir ad.

Yani sınavda bu kullanın, ve gayet iyi çalışıyor:

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ash100HD

    Ash100HD

    29 EKİM 2011
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008