util 스키마를 사용하여 목록을 자동 배선하면 NoSchBeanDefinition이 제공됩니다.예외.
Spring util 네임스페이스를 사용하여 이름 있는 목록과 함께 주입하려는 빈이 있습니다.<util:list id="myList">
하지만 봄은 대신 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)
이게 내가 예상한 방식일 거라고 생각했기 때문에 오히려 나를 곤혹스럽게 했다.
이는 3.11.2에서 규정되어 있는 @Autowired 동작의 다소 불명확한 부분이 원인입니다.@Autowired:
또한 특정 유형의 모든 원두를
ApplicationContext
해당 유형의 배열을 예상하는 필드 또는 메서드에 주석을 추가함으로써...유형화된 컬렉션에도 동일하게 적용됩니다.
바꿔 말하면,@Autowired @Qualifier("myList") List<String>
'모든 종류의 콩 목록을 달라'고 부탁하는 거죠java.lang.String
수식자 "myList"를 가진 사용자입니다.
솔루션은 3.11.3에 기재되어 있습니다. 한정자를 사용한 주석 기반 자동 배선 미세 조정:
주석 기반 주입을 이름으로 표현하려면 주로 사용하지 마십시오.
@Autowired
- 기술적으로 콩 이름을 언급할 수 있다 하더라도@Qualifier
가치.대신 JSR-250을 선호합니다.@Resource
주석: 특정 대상 컴포넌트를 고유한 이름으로 식별하기 위해 의미론적으로 정의되며 선언된 유형은 일치 프로세스와 무관합니다.이 의미차이의 구체적인 결과로서 컬렉션 또는 맵타입으로 정의되어 있는 콩 자체는 타입 매칭이 적절히 적용되지 않기 때문에 이들을 통해 주입할 수 없다.사용하다
@Resource
특정 컬렉션/맵빈을 고유 이름으로 참조한다.
테스트에 이것을 사용하면, 정상적으로 동작합니다.
@Resource(name="myList") private List<String> stringList;
또 다른 일어날 수 있는 일은 당신이 콩의 재산에 자동 배선을 하고 있다는 것이다.이 경우 자동 접속은 필요 없습니다.단, setter 메서드를 작성하고 bean 정의에서 속성 태그를 사용합니다(xml을 사용하는 경우).
<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
주석을 붙입니다.
언급URL : https://stackoverflow.com/questions/1363310/auto-wiring-a-list-using-util-schema-gives-nosuchbeandefinitionexception
'programing' 카테고리의 다른 글
스핀(비지) 컨트롤이 있는 angular.element vs document.getElementById 또는 jQuery 셀렉터 (0) | 2023.03.07 |
---|---|
AngularJS 지시:링크 기능과 컴파일 기능은 함께 작동합니까? (0) | 2023.03.07 |
ASP 입수 방법크롬을 사용하여 XML 대신 JSON을 반환하는 NET Web API를 선택하십시오. (0) | 2023.03.07 |
React에서 setState를 사용하여 개체 업데이트 (0) | 2023.03.07 |
Angular에서 ng-show를 전환하려면 어떻게 해야 합니까?부울에 기반한 JS? (0) | 2023.03.07 |