Friday 28 October 2011

Three Ways to use an EJB

Define a stateless session bean

@Stateless(name="personBean")
@Local(PersonManager.class)
public class PersonManagerBean 
    implements PersonManager {

    @PersistenceContext(unitName="unit")
    private EntityManager em;
    
    @Override
    public void save(Person person) {
        em.persist(person);
    }
}

Way 1: Dependency Injection

@Stateless(name="dependencyInjectionService")
@Local(Ejb3Service.class)
public class Ejb3ServiceDependencyInjectionBean 
   implements Ejb3Service {

    @EJB(beanName="personBean")
    private PersonManager personManager;
    
    @Override
    public void savePerson(Person person) {
        personManager.save(person);
    }
}

beanName attribute (personBean) of @EJB annotation matches the name attribute of @Stateless annotation.

Way 2: Initial Context Look Up

@Stateless(name="initalContextService")
@Local(Ejb3Service.class)
@EJB(name="ejb/personManager", 
         beanInterface=PersonManager.class,
         beanName="personBean") 
public class Ejb3ServiceInitialContextBean 
    implements Ejb3Service {

    @Override
    public void savePerson(Person person) {
        PersonManager personManager = null;
        try {
            Context ctx = new InitialContext();
            personManager = (PersonManager)
                     ctx.lookup("java:comp/env/ejb/personManager");
        } catch (javax.naming.NamingException ne) {
            throw new EJBException(ne);
        }
        personManager.save(person);
    }
}

@EJB annotation at class level registers the EJB with the beanName (i.e. personBean) in the JNDI ENC. The name attribute specifies the logical name (i.e. ejb/personManager) of the EJB in the JNDI ENC. This logical name can be looked up by InitialContext. (prefixed with “java:comp/env”)

Way 3: EJB Context Look up

@Stateless(name="ejbContextService")
@Local(Ejb3Service.class)
@EJB(name="ejb/personManager", 
         beanInterface=PersonManager.class,
         beanName="personBean") 
public class Ejb3ServiceEjbContextBean 
    implements Ejb3Service {

    @Resource
    private EJBContext ejbContext;
    @Override
    public void savePerson(Person person) {
        PersonManager personManager = (PersonManager)
            ejbContext.lookup("ejb/personManager");
        personManager.save(person);
    }
}

With Ejb context lookup, the lookup string doesn’t need to be prefixed with “java:comp/env”

Now write a servlet to test

public class PersonServlet extends HttpServlet {
    
    @EJB(beanName="ejbContextService")
    private Ejb3Service service1;
    
    @EJB(beanName="initalContextService")
    private Ejb3Service service2;
    
    @EJB(beanName="dependencyInjectionService")
    private Ejb3Service service3;
    
    @Override
    protected void doGet(HttpServletRequest req, 
            HttpServletResponse resp)
            throws ServletException, IOException {
        service1.savePerson(new Person("Sun8"));
        service2.savePerson(new Person("Sun9"));
        service3.savePerson(new Person("Sun10"));
    }
}