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:

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.

1 komentarze:

Anonimowy pisze...

Ś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