복붙노트

[SPRING] util 스키마를 사용하여리스트를 자동 배선하는 것은 NoSuchBeanDefinitionException을 준다.

SPRING

util 스키마를 사용하여리스트를 자동 배선하는 것은 NoSuchBeanDefinitionException을 준다.

Spring util 네임 스페이스 를 사용하여 명명 된 목록을 삽입하고자하는 bean을 가지고 있지만 Spring은 String 유형의 빈 모음을 대신 찾고 있습니다. 내 부러진 테스트는 다음과 같습니다.

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

오히려 그것이 내가 예상했던대로 나에게 어떤 수수께끼를 일으켰습니다.

해결법

  1. ==============================

    1.이는 3.11.2에 명시된 @ Autowired의 동작 중 다소 모호한 부분 때문입니다. @Autowired :

    이는 3.11.2에 명시된 @ Autowired의 동작 중 다소 모호한 부분 때문입니다. @Autowired :

    즉, @Autowired @Qualifier ( "myList") List 를 말하면 "myList"한정자를 가진 java.lang.String 유형의 모든 bean 목록을 제공해야합니다.

    해결책은 3.11.3에 언급되어있다. 한정자로 주석 기반 자동 와이어링 미세 조정 :

    그래서 이것을 테스트에 사용하면 잘 작동합니다.

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

    2.일어날 수있는 또 다른 일은 당신이 빈의 속성을 autowiring한다는 것입니다. 그런 경우 autowire 할 필요는 없지만, setter 메소드를 생성하고 bean 정의 (xml을 사용할 때)에서 property 태그를 사용하십시오. 예제 :

    일어날 수있는 또 다른 일은 당신이 빈의 속성을 autowiring한다는 것입니다. 그런 경우 autowire 할 필요는 없지만, setter 메소드를 생성하고 bean 정의 (xml을 사용할 때)에서 property 태그를 사용하십시오. 예제 :

    <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 주석을 참조하십시오.

  3. ==============================

    3.JBoss 6.1을 사용하는 경우 @Resource 주석으로 인해 배포가 실패했습니다 (자세한 내용은 질문과 관련이없는 것으로 생략되었습니다).

    JBoss 6.1을 사용하는 경우 @Resource 주석으로 인해 배포가 실패했습니다 (자세한 내용은 질문과 관련이없는 것으로 생략되었습니다).

    모든 응용 프로그램 서버에 대한 일반적인 대안은 @Inject 주석 (JSR-330)을 사용하는 것입니다.

  4. from https://stackoverflow.com/questions/1363310/auto-wiring-a-list-using-util-schema-gives-nosuchbeandefinitionexception by cc-by-sa and MIT license