3 Replies Latest reply on Jun 12, 2009 10:40 PM by Andy Gibson

    Problems with (Generic) Inheritance and Injection

    Andy Gibson Novice

      I was messing around with a generic Dao type beans and hit a wall, so I trawled the groups and couldn't find anything so I created a simple test case that should work, but doesn't. In one post, Pete indicated it might be be issue (but I can't find that blasted post now) so I'm posting here to see if there is a problem or not. I'm running this with JBoss 5.1 (default Web beans install) and while I have the current Webbeans from the svn repository it isn't compiling right now.

      Simple Test Case

      public abstract class AbstractFactory<T> implements Serializable {
           public abstract T createObject();


      public class IntegerFactory extends AbstractFactory<Integer> {
           public Integer createObject() {
                return new Integer(123);

      Used by

      public class SomeBean implements Serializable {
           AbstractFactory<Integer> integerFactory;
           public String getObjectAsString() {
                return integerFactory.createObject().toString();

      This works fine. However, if I change SomeBean to use :

      IntegerFactory integerFactory;

      Then I get an errror :

      javax.inject.UnsatisfiedDependencyException: The injection point   Field @Current integerFactory on Annotated class Class @Named SomeBean
      with binding types [@Current] in Dependent simple bean 'someBean' org.beanapp.jira.SomeBean,  API types = [Object, Serializable, SomeBean], binding types = [@Current] has unsatisfied dependencies with binding types 
           at org.jboss.webbeans.BeanValidator.validate(BeanValidator.java:112)
           at org.jboss.webbeans.bootstrap.WebBeansBootstrap.boot(WebBeansBootstrap.java:207)
           at org.jboss.webbeans.bootstrap.api.helpers.BootstrapBean.boot(BootstrapBean.java:120)
           at sun.reflect.GeneratedMethodAccessor446.invoke(Unknown Source)
           at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
           at java.lang.reflect.Method.invoke(Unknown Source)

      However, if I change the definition of the IntegerFactory to not inherit from the AbstractFactory, then it works fine :

      public class IntegerFactory implements Serializable {

      I tried using a binding type :

      public @interface IntFactory {

      With the binding type instead of using @Named and @Current to inject, I found it failed and worked in the same scenarios.

      I inherited  the IntFactory from some non generic pojo and it worked fine.  To test it, I'm using JSF (2.0) and testing #{someBean.objectAsString}

      Do I have it wrong, am I missing something simple, or is there a problem with WebBeans?


      Andy Gibson