4 Replies Latest reply on Apr 5, 2007 11:53 AM by trickyvail

    Injection of a stateless session bean (SLSB) into another SL

    trickyvail

      I've set up a SLSB as follows:

      @Stateless
      @Name("simpleBean")
      public class SimpleBean implements Simple
      {
       public String getName()
       {
       return "simple";
       }
      }
      


      The "simpleBean" bean can be accessed from a EL expression on a facelets page without any trouble.

      I have another SLSB like this:
      @Stateless
      @Name("containerBean")
      public class ContainerBean implements Container
      {
       @In
       SimpleBean simpleBean;
      
       public String getName()
       {
       return simpleBean.getName();
       }
      }

      However, when I try to access the getName method of "containerBean" I run into the following error:
      Caused by: org.jboss.seam.RequiredException: In attribute requires non-null value: containerBean.simpleBean
       at org.jboss.seam.Component.getValueToInject(Component.java:1919)
      

      If I change "simpleBean" into a JavaBean provided and annotate "containerBean" with In(create=true) the injection works as expected, but if I create a similar annotation without changing "simpleBean" to a JavaBean I get an error like this:
      ... 95 more
      Caused by: java.lang.IllegalArgumentException: Could not set field value by reflection: ContainerBean.simpleBean on: com.somedomain.stateless.ContainerBean with value: class org.javassist.tmp.java.lang.Object_$$_javassist_3
       at org.jboss.seam.util.Reflections.set(Reflections.java:77)
       at org.jboss.seam.Component.setFieldValue(Component.java:1555)
       ... 117 more
      Caused by: java.lang.IllegalArgumentException
       at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63)
      

      The seam documentation makes it clear that SLSB's live in the stateless context which is not included in the context search. Is this why my "simpleBean" can not be found for injection into my "containerBean"? I'm not familiar with how seam and the ejb3 container interact during instantiation of these SLSB objects into pools - perhaps the beans are being created out of order? Perhaps I'm trying to do something way beyond the intention of the EJB3 SLSB specification. I'm pretty much resolved that what I'm trying to do here is not a great idea. Is there a different way to dynamically assign a reference to a SLSB to a different SLSB when a method is called? I would be very interested to hear other peoples insight and wisdom on the subject. Thanks in advance and kind regards.