For those not having the luxury to change an ear to a war, I've found the following workaround:
- Create an EJB in the war
- Inject that EJB with the EJBs from the EJB module
- Add CDI producer methods
- Qualify
@Inject
with the qualifier for those producer methods:
Code:
// This bean is defined in the WEB module
@Stateless
public class EJBFactory {
@EJB
protected UserDAO userDAO;
// ~X other EJBs injected here
@Produces @EJBBean
public UserDAO getUserDAO() {
return userDAO;
}
// ~X other producer methods here
}
Now EJBs from anywhere in the EAR can be injected with:
// This bean is also defined in the web module
@RequestScoped
public class MyBean {
@Inject @EJBBean
private UserDAO userDAO; // injection works
public void test() {
userDao.getByID(...); // works
}
}
EJBBean is a simple standard qualifier annotation. For completeness, here it is:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface EJBBean {
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…