目前我正在尝试将无状态EJB注入Jboss 6 AS Final上的CDI托管控制器。控制器在上下文中管理,可从JSF页面访问。如果我使用@EJB
注入无状态bean,它就可以工作了。如果我用@Inject
注入无状态EJB,我会得到以下异常:
我的控制器:
@Named("TestController")
public class TestController {
@Inject
private TestManagerLocal myTestManager;
...
}
}
我的无状态豆:
@SuppressWarnings("unchecked")
@Stateless
public class TestManagerBean implements TestManagerLocal {
@PersistenceContext
private EntityManager em;
...
}
Bean的界面使用@Local进行注释。
如果我尝试调用myTestManager,我会得到以下异常:
WELD-000079无法在JNDI:class中找到EJB de.crud.org $ $的JBoss焊接$豆的JBoss $类加载器:ID = “VFS:$$$ USR $ $本地的JBoss $服务器$ $默认部署$ $测试耳” -SessionBean-TestManagerBean _ _ $$ WeldProxy
太多了。
答案 0 :(得分:8)
对于那些没有奢侈品来改变战争的人,我发现了以下解决方法:
@Inject
:代码:
// 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
}
现在,EAR中任何位置的EJB都可以注入:
// 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是一个简单的标准限定符注释。为了完整起见,这里是:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface EJBBean {
}
答案 1 :(得分:2)
问题是,我构建并部署了我的应用程序。当我将我的应用程序部署为包含所有EJB的战争时,Weld正在工作。
答案 2 :(得分:2)
目前,由于EAR-Deployments中的WAR不共享同一个类加载器,因此会出现各种问题。有关JBoss-AS JIRA中正在进行的讨论,请参阅https://issues.jboss.org/browse/JBAS-8683(并将其投票:-))
更新我在how to disable separate classloaders上找到了此信息,选项1对我有用,但要非常小心。没有任何理由没有引入类加载器的分离,所以显然前方的道路上存在新问题......