1 Reply Latest reply: Mar 20, 2012 9:30 AM by Eric Tano RSS

    AS 6.1 EJB dependencies

    Eric Tano Newbie



      I'm having some difficulties after switching a legacy project from EJB2.1 with JBoss 5.0 to EJB3 with JBoss AS 6.1. I do have lots of EJB modules, and there are dependencies among the EJBs. I was under the impression by declaring a dependency (with @EJB) this would affect the deployment order, which does not seem to be true.


      Suppose you have the following EAR structure:



      - ejb1.jar

      |- Bean1 (SLSB)

      - ejb2.jar

      |- Bean2 (SLSB)

      - (... more EJB modules)


      Now Bean2 needs Bean1. This will look like this:



      public Bean1 {




      @EJB(beanInterface=package1.Bean1.class, name="Bean1")
      public Bean2 {



      What I see in the log is:


      15:16:57,230 INFO  [JBossASKernel] installing bean: jboss.j2ee:ear=my.ear,jar=ejb2.jar,name=Bean2,service=EJB3
      15:16:57,230 INFO  [JBossASKernel]   with dependencies:
      15:16:57,230 INFO  [JBossASKernel]   and demands:
      15:16:57,230 INFO  [JBossASKernel]     jboss-switchboard:appName=my,module=ejb2,name=Bean2; Required: Create
      15:16:57,230 INFO  [JBossASKernel]     jboss.ejb:service=EJBTimerService; Required: Described
      15:16:57,230 INFO  [JBossASKernel]     jboss-injector:topLevelUnit=my.ear,unit=ejb2.jar,bean=Bean2,interceptor=org.jboss.weld.integration.ejb.interceptor.Jsr299BindingsInterceptor; Required: Described
      15:16:57,231 INFO  [JBossASKernel]     jboss-injector:topLevelUnit=my.ear,unit=ejb2.jar,bean=Bean2,interceptor=org.jboss.weld.integration.ejb.SessionBeanInterceptor; Required: Described
      15:16:57,231 INFO  [JBossASKernel]     jboss-injector:topLevelUnit=my.ear,unit=ejb2.jar,bean=Bean2; Required: Described
      15:16:57,231 INFO  [JBossASKernel]   and supplies:
      15:16:57,231 INFO  [JBossASKernel]     jndi:ejb2/Bean2/local
      15:16:57,231 INFO  [JBossASKernel]     Class:package2.Bean2
      15:16:57,231 INFO  [JBossASKernel]     jndi:Bean2
      15:16:57,231 INFO  [JBossASKernel] Added bean(jboss.j2ee:ear=my.ear,jar=ejb2.jar,name=Bean2,service=EJB3) to KernelDeployment of: ejb2.jar
      15:16:57,268 INFO  [JBossASKernel] installing bean: jboss.j2ee:ear=my.ear,jar=ejb1.jar,name=Bean1,service=EJB3
      15:16:57,268 INFO  [JBossASKernel]   with dependencies:
      15:16:57,268 INFO  [JBossASKernel]   and demands:
      15:16:57,268 INFO  [JBossASKernel]     jboss.ejb:service=EJBTimerService; Required: Described
      15:16:57,268 INFO  [JBossASKernel]     jboss-switchboard:appName=my,module=ejb1,name=Bean1; Required: Create
      15:16:57,268 INFO  [JBossASKernel]     jboss-injector:topLevelUnit=my.ear,unit=ejb1.jar,bean=Bean1; Required: Described
      15:16:57,268 INFO  [JBossASKernel]   and supplies:
      15:16:57,269 INFO  [JBossASKernel]     Class:package1.Bean1
      15:16:57,269 INFO  [JBossASKernel]     jndi:my/Bean1/local-package1.Bean1
      15:16:57,269 INFO  [JBossASKernel]     jndi:Bean1
      15:16:57,269 INFO  [JBossASKernel] Added bean(jboss.j2ee:ear=my.ear,jar=ejb1.jar,name=Bean1,service=EJB3) to KernelDeployment of: ejb1.jar



      There is no dependency on ejb1/Bean1 noted. Also, the deployment does not seem to honor the dependency either.


      In Bean2 I will at some point perform a JNDI lookup on java:comp/env/Bean1. And in fact, when a client accesses Bean2 during the initalisation/deployment of the server the lookups on "Bean1" from Bean2 will result in NameNotFoundExceptions.


      I tried some variants of the @EJB annotation on Bean2 (mostly trying out different combinations of "beanName"  and "mappedName". I would expect that if I did this correctly the dependence would be notet in the log in either "with dependencies:" or "and demands:".


      Then I tried this, which actually worked:



      @EJB(beanInterface=package1.Bean1.class, name="Bean1")
      @Depends( { "jboss.j2ee:ear=my.ear,jar=ejb1.jar,name=Bean1,service=EJB3" })
      public Bean2 {



      HOWEVER, it does not work without the EAR name. As the EJB module is reused in different applications this will not work out.


      My preliminary solutions is to use a jboss-app.xml with




      and explicit order of the modules in application.xml.


      My question is:


      Is my workaround with jboss-app.xml the only way to solve this? I would prefer if it would somehow work out just be using the @EJB annotations. Is there any way to get this working?