Search code examples
jakarta-eedependency-injectionejb

Choose EJB to be injected without recompiling


Imagine you have two implementations of a @Local interface

@Local
public interface LocalInterface {
}

@Stateless
public class MyFirstImplementation implements LocalInterface {
}

@Stateless
public class MySecondImplementation implements LocalInterface {
}

And I want to choose, without recompiling the project (that is, at runtime or using an external configuration property) which one (MyFirstImplementation or MySecondImplementation) I want to use.

public class MyClass {
   @EJB
   LocalInterface local;
}

Once one implementation is chosen, it does not have to change. I am using JBoss 5.1 if that helps.


Solution

  • You can achieve it using the deployment descriptor - ejb-jar.xml. Something like this (might not be 100% accurate, but I think you've got the point):

    <ejb-jar> 
       <enterprise-beans>
          <session>
             <ejb-name>MyClass</ejb-name>
             <ejb-ref>
                <ejb-ref-name>ejb/myLocalReferencedBean</ejb-ref-name>
                <ejb-ref-type>Session</ejb-ref-type>
                <local>com.yourpackage.LocalInterface</local>
                <ejb-link>MyFirstImplementation</ejb-link>
                <injection-target>local</injection-target>
             </ejb-ref>
          </session>
    
          <session>
             <ejb-name>MyFirstImplementation</ejb-name>
             <!-- ... -->
          </session>
          <session>
             <ejb-name>MySecondImplementation</ejb-name>
             <!-- ... -->
          </session>
       </enterprise-beans>
    </ejb-jar>
    

    Another way is to use the CDI as described here: Inject @EJB bean based on conditions