You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "ASF subversion and git services (JIRA)" <ji...@apache.org> on 2015/05/03 21:27:06 UTC

[jira] [Commented] (WICKET-5808) SpringBean, support generic beans

    [ https://issues.apache.org/jira/browse/WICKET-5808?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14525975#comment-14525975 ] 

ASF subversion and git services commented on WICKET-5808:
---------------------------------------------------------

Commit cca193ba8aec5f100bbe3f49f766b7403cef2a12 in wicket's branch refs/heads/master from [~mgrigorov]
[ https://git-wip-us.apache.org/repos/asf?p=wicket.git;h=cca193b ]

WICKET-5808 Remove unused member field


> 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)