7

目前我正在尝试将无状态 EJB 注入到 Jboss 6 AS Final 上的 CDI 托管控制器中。控制器在可从 JSF 页面访问的上下文中进行管理。如果我用它注入无状态bean,@EJB它就可以工作。如果我注入无状态 EJB,@Inject我会得到以下异常:

我的控制器:

@Named("TestController")
public class TestController {   
    @Inject
    private TestManagerLocal myTestManager;
        ...
    }
}

我的无状态bean:

@SuppressWarnings("unchecked")
@Stateless
public class TestManagerBean implements TestManagerLocal {

    @PersistenceContext
    private EntityManager em;
        ...
}

Bean 的接口使用@Local 进行注解。

如果我尝试调用 myTestManager 我得到以下异常:

WELD-000079 在 JNDI 中找不到 EJB:类 de.crud.org$jboss$weld$bean-jboss$classloader:id="vfs:$$$usr$local$jboss$server$default$deploy$test$耳朵"-SessionBean-TestManagerBean_$$_WeldProxy

多谢。

4

3 回答 3

9

对于那些没有勇气将耳朵变成战争的人,我找到了以下解决方法:

  • 在战争中创建 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 {

}
于 2011-04-18T20:02:51.053 回答
2

问题是,我构建并部署了我的应用程序作为一个耳朵。当我将我的应用程序部署为包括所有 EJB 的战争时,Weld 正在工作。

于 2011-02-22T23:09:29.160 回答
2

目前,EAR-Deployments 中的 WAR 不共享相同的类加载器会导致各种问题。有关JBoss-AS JIRA 中正在进行的讨论,请参阅https://issues.jboss.org/browse/JBAS-8683 (并投票赞成:-))

更新我找到了关于如何禁用单独的类加载器的信息,选项 1 对我有用,但要非常小心。类加载器的分离没有无缘无故的引入,那么显然前面的路上又出现了新的问题……

于 2011-04-19T05:26:30.597 回答