public class TestBean {
private List<TestDep> deps;
@Autowired
public void setTestDeps(List<TestDep> deps) {
this.deps = deps;
}
}
public class TestDep {
}
<beans>
<context:annotation-config/>
<bean id="testBean" class="test.TestBean" scope="prototype"/>
<bean id="testDep" class="test.TestDep"/>
</beans>
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = ...
ctx.getBean("testBean");
ctx.getBean("testBean");
}
}pierwsze wywołanie ctx.getBean("testBean") zadziała poprawnie, ale drugie (i każde następne) zgłosi wyjątek IllegalArgumentException: argument type mismatch. Problemy powoduje kod odpowiedzialny za cache'owanie referencji do komponentów w klasie wewnętrznej AutowiredAnnotationBeanPostProcessor.AutowiredMethodElement.
Wpisałem zgłoszenie do JIRY (numer SPR-4438) i po 39 minutach (!) błąd został poprawiony, a poprawka włączona do wersji 2.5.2. Rewelacja.
[aktualizacja 2008.03.04]
Wersja 2.5.2 została wydana wczoraj i AutowiredAnnotationBeanPostProcessor działa w niej poprawnie.
Problem z adnotacją @Autowire w Springu 2.5.1
Bug ujawnia się dość specyficznej sytuacji: jeżeli używamy automatycznego rozwiązywania zależności (autowiring) opartego na adnotacjach, mamy komponent nie będący singletonem i mający przynajmniej jeden atrybut będący kolekcją. W poniższym przykładzie:
1 comments:
Świetnie, że ten problem tak wcześnie zauważyłeś. Twój post okazał się bardzo pomocny. Ja miałem analogiczny problem z @Scope("session") i także w tym przypadku wersja 2.5.2 pomogła.
Pozdrawiam Mirek Karczewski
Prześlij komentarz