使用@Inject将无状态EJB注入CDI Weld ManagedBean(jboss 6 AS上的JSF 1.2 EJB应用程序)

时间:2011-02-20 21:50:26

标签: dependency-injection cdi ejb-3.1 jboss-weld

目前我正在尝试将无状态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

太多了。

3 个答案:

答案 0 :(得分:8)

对于那些没有奢侈品来改变战争的人,我发现了以下解决方法:

  • 在战争中创建一个EJB
  • 使用EJB模块中的EJB注入EJB
  • 添加CDI制作人方法
  • 使用这些生产者方法的限定符限定@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对我有用,但要非常小心。没有任何理由没有引入类加载器的分离,所以显然前方的道路上存在新问题......