Spring 4 is able to wire/inject generic beans, as described here:
http://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics .
However, I'm experiencing problems when using generic beans with Wicket's
SpringBean.
I basically have following situation, two concrete dao's that implement a
generic typed interface dao.:
class Product{}
class Car extends Product{}
class Phone extends Product{}
interface ProductDao<T extends Product> {}
class CarProductDao implements ProductDao<Car> {}
class PhoneProductDao implements ProductDao<Phone> {}
class ProductModel<T extends Product> extends LoadableDetachableModel<T> {
@SpringBean ProductDao<T> productDao;
class ProductPage extends WebPage {
...
ProductModel<CarProduct> model = new ProductModel<CarProduct>(product);
...
This will result in the following error:
2015-jan-06;01:53:23.471 http-nio-8080-exec-6 WARN RequestCycleExtra -
Handling the following exception
java.lang.IllegalStateException: More than one bean of type [ProductDao]
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: carProductDao,phoneProductDao
at
org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getBeanNameOfClass(AnnotProxyFieldValueFactory.java:289)
~[AnnotProxyFieldValueFactory.class:6.18.0]
at
org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getBeanName(AnnotProxyFieldValueFactory.java:198)
~[AnnotProxyFieldValueFactory.class:6.18.0]
at
org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getFieldValue(AnnotProxyFieldValueFactory.java:130)
~[AnnotProxyFieldValueFactory.class:6.18.0]
at org.apache.wicket.injection.Injector.inject(Injector.java:111)
~[Injector.class:6.18.0]
at
org.apache.wicket.spring.injection.annot.SpringComponentInjector.inject(SpringComponentInjector.java:124)
~[SpringComponentInjector.class:6.18.0]
at ProductModel.<init>(ProductModel.java:20) ~[ProductModel.class:na]
at ProductPage$15.populateItem(ProductPage.java:742)
~[ProductPage$15.class:na]
Does Wicket's SpringBean support Spring-4's generics support?
http://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics .
However, I'm experiencing problems when using generic beans with Wicket's
SpringBean.
I basically have following situation, two concrete dao's that implement a
generic typed interface dao.:
class Product{}
class Car extends Product{}
class Phone extends Product{}
interface ProductDao<T extends Product> {}
class CarProductDao implements ProductDao<Car> {}
class PhoneProductDao implements ProductDao<Phone> {}
class ProductModel<T extends Product> extends LoadableDetachableModel<T> {
@SpringBean ProductDao<T> productDao;
class ProductPage extends WebPage {
...
ProductModel<CarProduct> model = new ProductModel<CarProduct>(product);
...
This will result in the following error:
2015-jan-06;01:53:23.471 http-nio-8080-exec-6 WARN RequestCycleExtra -
Handling the following exception
java.lang.IllegalStateException: More than one bean of type [ProductDao]
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: carProductDao,phoneProductDao
at
org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getBeanNameOfClass(AnnotProxyFieldValueFactory.java:289)
~[AnnotProxyFieldValueFactory.class:6.18.0]
at
org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getBeanName(AnnotProxyFieldValueFactory.java:198)
~[AnnotProxyFieldValueFactory.class:6.18.0]
at
org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getFieldValue(AnnotProxyFieldValueFactory.java:130)
~[AnnotProxyFieldValueFactory.class:6.18.0]
at org.apache.wicket.injection.Injector.inject(Injector.java:111)
~[Injector.class:6.18.0]
at
org.apache.wicket.spring.injection.annot.SpringComponentInjector.inject(SpringComponentInjector.java:124)
~[SpringComponentInjector.class:6.18.0]
at ProductModel.<init>(ProductModel.java:20) ~[ProductModel.class:na]
at ProductPage$15.populateItem(ProductPage.java:742)
~[ProductPage$15.class:na]
Does Wicket's SpringBean support Spring-4's generics support?