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

Dependency injection 将带有@Inject的无状态EJB注入CDI Weld ManagedBean(jboss 6 AS上的JSF 1.2 EJB应用程序),dependency-injection,cdi,ejb-3.1,jboss-weld,Dependency Injection,Cdi,Ejb 3.1,Jboss Weld,目前,我正在尝试将无状态EJB作为最终版本注入JBoss6上的CDI托管控制器。控制器在可从JSF页面访问的上下文中进行管理。如果我用@EJB注入无状态bean,它就会工作。如果使用@inject注入无状态EJB,则会出现以下异常: 我的控制器: @Named(“TestController”) 公共类TestController{ @注入 私有测试管理器本地myTestManager; ... } } 我的无状态bean: @SuppressWarnings(“未选中”) @无国籍 公共类T

目前,我正在尝试将无状态EJB作为最终版本注入JBoss6上的CDI托管控制器。控制器在可从JSF页面访问的上下文中进行管理。如果我用
@EJB
注入无状态bean,它就会工作。如果使用
@inject
注入无状态EJB,则会出现以下异常:

我的控制器:

@Named(“TestController”)
公共类TestController{
@注入
私有测试管理器本地myTestManager;
...
}
}
我的无状态bean:

@SuppressWarnings(“未选中”)
@无国籍
公共类TestManagerBean实现TestManagerLocal{
@持久上下文
私人实体管理者;
...
}
Bean的接口用@Local注释

如果我尝试调用myTestManager,会出现以下异常:

WELD-000079在JNDI:类中找不到EJB de.crud.org$jboss$weld$bean jboss$classloader:id=“vfs:$$$usr$local$jboss$server$default$deploy$test$ear”-SessionBean-TestManagerBean\u$$\ uweldproxy


THX很多。

问题是,我将应用程序构建并部署为ear。当我将我的应用程序部署为war(包括所有EJB)时,Weld正在工作。

对于那些没有能力将ear更改为war的人,我找到了以下解决方法:

  • 在战争中创建EJB
  • 使用来自EJB模块的EJB注入该EJB
  • 添加CDI生产者方法
  • 使用这些生产者方法的限定符限定
    @Inject
代码:

//此bean在WEB模块中定义
@无国籍
公共级EJBFactory{
@EJB
受保护的UserDAO UserDAO;
//~X在这里注入了其他EJB
@生成@EJBBean
公共UserDAO getUserDAO(){
返回userDAO;
}
//~X这里还有其他制作方法
}
现在,耳朵中任何地方的EJB都可以注入:

//此bean也在web模块中定义
@请求范围
公共类MyBean{
@注入@EJBBean
私有UserDAO UserDAO;//注入工作正常
公开无效测试(){
userDao.getByID(…);//有效
}
}
EJBBean是一个简单的标准限定符注释。为了完整起见,这里是:

@限定符
@保留(运行时)
@目标({类型、方法、字段、参数})
public@interface EJBBean{
}

目前,EAR部署中的WAR不共享同一个类加载器,这一事实导致了各种问题。请参阅JBoss中正在进行的关于JIRA的讨论(并投票赞成:-)


更新我在上找到了此信息,选项1对我有效,但请格外小心。类加载器的分离并不是无缘无故地引入的,所以很明显前面还有新的问题……

是否有必要将
EJBFactory
注释为
@Stateless
,这样才能工作?是的,EJBFactory需要是一个会话bean。问题是,war中定义的ejbbean(消息驱动的或会话的)通常可以与EJB模块中定义的ejbbean一起注入。因为工厂需要从某处抓取豆子,这是个好地方。或者,您不能使用无状态对工厂进行注释,并使用EJB模块bean对第二个bean进行注释和注入。然后,@将第二个bean注入工厂,让工厂从中获取所需的bean。但仅仅结合这两个概念似乎容易得多。