[
https://issues.apache.org/jira/browse/WICKET-5808?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14291601#comment-14291601
]
Tobias Soloschenko commented on WICKET-5808:
--------------------------------------------
Yes I know what you mean, but imagin the code the spring integration has to
return for the AnySetImpl. If you say that the field is of AnySetImpl you have
to return an instance of "AnySetImpl" and of any other implementation. The user
would think that he / she is able to define its own Set implementation and use
it here, but this would not be possible because the wicket spring integration's
code is not supporting that, because there is no "return anySetImpl;"
> 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, 7.0.0-M4
> Environment: Spring Framework 4.1.4.RELEASE (currently the latest
> version)
> Reporter: Flying Wolf
> Assignee: Andrea Del Bene
> Priority: Minor
> Labels: generics, spring
> Fix For: 7.0.0-M5
>
> Attachments: AnnotProxyFieldValueFactory.java,
> AnnotProxyFieldValueFactory.new.java, CollectionResolving.java,
> SpringBeanLocator.java, SpringBeanLocator.new.java, myproject.zip
>
>
> *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}
> *Workaround solution:*
> Explicitly using bean names (qualifiers) does work. In this case
> {code}
> @SpringBean private CarDao nonGenericCarDao;
> @SpringBean private GenericDao<Car> genericCarDao;
> {code}
> has to be changed to:
> {code}
> @SpringBean(name = "carDao") private CarDao nonGenericCarDao;
> @SpringBean(name = "carDao") private GenericDao<Car> genericCarDao;
> {code}
> *Description of some of the attached files:*
> * pom.xml: added spring-context, spring-web, wicket-spring dependencies.
> Changed java version to 1.8.
> * WicketApplication: added Spring support
> * SpringApp: boots plain Spring and shows that DaoClient is able to autowire
> generic beans.
> * HomePage: a Wicket WebPage that shows that SpringBean throws the error when
> using generic beans.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)