Java 通过注入从JBoss AS中的不同WAR访问EJB
我的项目结构如下Java 通过注入从JBoss AS中的不同WAR访问EJB,java,jakarta-ee,jboss7.x,cdi,ejb-3.1,Java,Jakarta Ee,Jboss7.x,Cdi,Ejb 3.1,我的项目结构如下 java:global/ControlWeb-portlet/CdiServiceImpl!com.clink.cdi.CdiServiceImpl java:app/ControlWeb-portlet/CdiServiceImpl!com.clink.cdi.CdiServiceImpl java:module/CdiServiceImpl!com.clink.cdi.CdiServiceImpl java:global/ControlWeb-por
java:global/ControlWeb-portlet/CdiServiceImpl!com.clink.cdi.CdiServiceImpl
java:app/ControlWeb-portlet/CdiServiceImpl!com.clink.cdi.CdiServiceImpl
java:module/CdiServiceImpl!com.clink.cdi.CdiServiceImpl
java:global/ControlWeb-portlet/CdiServiceImpl
java:app/ControlWeb-portlet/CdiServiceImpl
java:module/CdiServiceImpl
JBoss AS 7.1.3.Final-redhat-4
包含EJB的war VWeb.war,当部署VWeb时,我得到以下信息
java:global/VWeb/QServiceImpl!com.vi.qciapi.QService
java:app/VWeb/QServiceImpl!com.vi.qciapi.QService
java:module/QServiceImpl!com.vi.qciapi.QService
java:global/VWeb/QServiceImpl
java:app/VWeb/QServiceImpl
java:module/QServiceImpl
我有另一个war(ControlWebPortlet.war),它是一个liferay项目,我正在尝试从ControlWebPortlet访问bean中的上述EJB。bean是@viewscope的,这是基于找到的链接完成的
我尝试了所有这些组合,但似乎没有任何效果
@Inject
QService qService;
@EJB
QService qService;
@EJB(mappedName="java:global/VWeb/QServiceImpl!com.vi.qciapi.QService")
QService qService;
@EJB(beanInterface=QService.class)
QService qService;
@EJB(mappedName="java:global/VWeb/QServiceImpl!com.vi.qciapi.QService")
QService qService;
我在同一个项目ControlWebPortlet中保留了一个EJB,其部署如下
java:global/ControlWeb-portlet/CdiServiceImpl!com.clink.cdi.CdiServiceImpl
java:app/ControlWeb-portlet/CdiServiceImpl!com.clink.cdi.CdiServiceImpl
java:module/CdiServiceImpl!com.clink.cdi.CdiServiceImpl
java:global/ControlWeb-portlet/CdiServiceImpl
java:app/ControlWeb-portlet/CdiServiceImpl
java:module/CdiServiceImpl
我能够向EJB注入
@EJB
CdiServiceImpl cdiServiceImpl;
当从不同的服务器访问EJB时,我需要做什么特定的事情吗
提前谢谢
Charlie如果我理解正确,你应该继续使用@EJB作为远程bean。如果我理解正确,你应该继续使用@EJB作为远程bean。一个可能的解决方法是在第二次战争中,在
jboss部署结构.xml
文件中添加对VWeb.war
的依赖。看起来是这样的:
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="deployment.VWeb.war" />
</dependencies>
</deployment>
</jboss-deployment-structure>
如果这不起作用,您也可以尝试上述解决方法。(在
ControlWebPortlet.war
中创建一个@Stateless
EJB,该EJB通过@EJB
注入所需的bean,然后通过生产者方法公开该bean,该方法允许您在最终目的地中使用@Inject
)一个可能的修复方法是在第二次war中,将对VWeb.war
的依赖项添加到jboss部署结构.xml
文件中。看起来是这样的:
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="deployment.VWeb.war" />
</dependencies>
</deployment>
</jboss-deployment-structure>
如果这不起作用,您也可以尝试上述解决方法。(在
ControlWebPortlet.war
中创建一个@Stateless
EJB,它通过@EJB
注入所需的bean,然后通过producer方法公开这个bean,它允许您在最终目的地中使用@Inject
)显然我刚才回答了这个问题。既然它在那里被标记为正确答案,我想我也应该在这里复制它
我使用以下方法使其工作: 首先,使用
@products
注释将EJB定义为资源:
public class Resources {
@Produces
@EJB(lookup = "java:global/.../WhateverService")
private WhateverService whateverService;
}
// ...
@Inject
private WhateverService whateverService;
// ...
然后,使用@inject
注释在bean中注入EJB资源:
public class Resources {
@Produces
@EJB(lookup = "java:global/.../WhateverService")
private WhateverService whateverService;
}
// ...
@Inject
private WhateverService whateverService;
// ...
工作起来很有魅力。我也在使用类似的CDI视图范围方法。很显然,我刚才已经回答了这个问题。既然它在那里被标记为正确答案,我想我也应该在这里复制它
我使用以下方法使其工作: 首先,使用
@products
注释将EJB定义为资源:
public class Resources {
@Produces
@EJB(lookup = "java:global/.../WhateverService")
private WhateverService whateverService;
}
// ...
@Inject
private WhateverService whateverService;
// ...
然后,使用@inject
注释在bean中注入EJB资源:
public class Resources {
@Produces
@EJB(lookup = "java:global/.../WhateverService")
private WhateverService whateverService;
}
// ...
@Inject
private WhateverService whateverService;
// ...
工作起来很有魅力。我还使用了类似的CDI视图范围方法