Dependency injection 将带有@Inject的无状态EJB注入CDI Weld ManagedBean(jboss 6 AS上的JSF 1.2 EJB应用程序)
目前,我正在尝试将无状态EJB作为最终版本注入JBoss6上的CDI托管控制器。控制器在可从JSF页面访问的上下文中进行管理。如果我用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
注入无状态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。但仅仅结合这两个概念似乎容易得多。