Flying Wolf created WICKET-5808:
-----------------------------------
Summary: SpringBean, support generic beans
Key: WICKET-5808
URL: https://issues.apache.org/jira/browse/WICKET-5808
Project: Wicket
Issue Type: Improvement
Components: wicket-spring
Affects Versions: 6.18.0
Environment: Spring Framework 4.1.4.RELEASE (currently the latest
version)
Reporter: Flying Wolf
Priority: Minor
*Short Description:*
Since Spring Framework 4.0, Spring is able to inject/autowire generic beans
like:
{code}@Autowired public GenericDao<Car> genericCarDao;{code}
As is described here:
http://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics .
However, SpringBean doesn't seem to support this yet, resulting in a
IllegalStateException.
*Detailed Description*
Given the following code:
{code}public interface GenericDao<T> {}{code}
{code}@Repository
public class CarDao implements GenericDao<Car> {}{code}
{code}@Repository
public class PhoneDao implements GenericDao<Phone> {}{code}
{code}@Component
public class DaoClient {
@Autowired public GenericDao<Car> genericCarDao;
@Autowired public CarDao nonGenericCarDao;
}{code}
Spring 4 is able to inject both "genericCaoDao" and "nonGenericCarDao" into the
DaoClient class.
Performing the same using SpringBean, fails:
{code}public class HomePage extends WebPage {
@SpringBean private CarDao nonGenericCarDao;
@SpringBean private GenericDao<Car> genericCarDao;
//.....
}
{code}
In this case, SpringBean is unable to inject "genericCarDao", and throws the
following error:
{code}
Caused by: java.lang.IllegalStateException: More than one bean of type
[com.mycompany.springcomponents.GenericDao] found, you have to specify the name
of the bean (@SpringBean(name="foo")) or (@Named("foo") if using @javax.inject
classes) in order to resolve this conflict. Matched beans: carDao,phoneDao
at
org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getBeanNameOfClass(AnnotProxyFieldValueFactory.java:289)
at
org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getBeanName(AnnotProxyFieldValueFactory.java:198)
at
org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getFieldValue(AnnotProxyFieldValueFactory.java:130)
at org.apache.wicket.injection.Injector.inject(Injector.java:111)
at
org.apache.wicket.spring.injection.annot.SpringComponentInjector.inject(SpringComponentInjector.java:124)
at
org.apache.wicket.spring.injection.annot.SpringComponentInjector.onInstantiation(SpringComponentInjector.java:130)
at
org.apache.wicket.application.ComponentInstantiationListenerCollection$1.notify(ComponentInstantiationListenerCollection.java:38)
at
org.apache.wicket.application.ComponentInstantiationListenerCollection$1.notify(ComponentInstantiationListenerCollection.java:34)
at
org.apache.wicket.util.listener.ListenerCollection.notify(ListenerCollection.java:80)
at
org.apache.wicket.application.ComponentInstantiationListenerCollection.onInstantiation(ComponentInstantiationListenerCollection.java:33)
at org.apache.wicket.Component.<init>(Component.java:687)
at org.apache.wicket.MarkupContainer.<init>(MarkupContainer.java:121)
at org.apache.wicket.Page.<init>(Page.java:168)
at org.apache.wicket.Page.<init>(Page.java:157)
at org.apache.wicket.markup.html.WebPage.<init>(WebPage.java:106)
at com.mycompany.HomePage.<init>(HomePage.java:22)
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)