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

Tobias Soloschenko edited comment on WICKET-5808 at 1/8/15 12:26 PM:
---------------------------------------------------------------------

Did you try to add a name to the CarDao and GenericDao and use 
@SpringBean(name="carDao") and @SpringBean(name="genericDao"), because if a 
CarDao is a GenericDao Spring / Wicket's Spring Integration gets confused which 
Dao to Inject for the GenericDao class attribute. 

This is only to ensure that this is not an injection issue. 

This means that you have to use @Repository("carDao") and 
@Repository("genericDao").


was (Author: klopfdreh):
Did you try to add a name to the CarDao and GenericDao and use 
@SpringBean(name="carDao") and @SpringBean(name="genericDao"), because if a 
CarDao is a GenericDao Spring / Wicket's Spring Integration gets confused which 
Dao to Inject for the GenericDao class attribute. This is only to ensure that 
this is not an injection issue.



> 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
>              Labels: generics, spring
>         Attachments: 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}
> *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)

Reply via email to