我是EJB3的新手,当两个人在同一台服务器(WAS 8)上的独立ear文件中时,无法从我的JSF托管bean调用远程ejb。如果他们在同一个耳朵文件中,那么我没有问题。但我需要调用在同一台服务器上的不同应用程序之间工作。
在EJB注入Managed Bean期间,我得到以下异常:
Caused by: javax.ejb.EJBException: The EJB/BelgianBeerSessionBean EJB reference in the null component in the BeerStoreWebProject.war module of the BeerStoreWebEAR application could not be resolved; nested exception is: com.ibm.ejs.container.EJBNotFoundException: EJB with interface com.ejb.view.BelgianBeerSessionBeanRemote not present in application BeerStoreWebEAR
Caused by: com.ibm.ejs.container.EJBNotFoundException: EJB with interface com.ejb.view.BelgianBeerSessionBeanRemote not present in application BeerStoreWebEAR
at com.ibm.ejs.container.HomeOfHomes.getHomeByInterface(HomeOfHomes.java:928)
at com.ibm.ws.ejbcontainer.injection.factory.EJBLinkObjectFactory.getObjectInstance(EJBLinkObjectFactory.java:261)
at com.ibm.ws.ejbcontainer.injection.factory.EJBLinkObjectFactory.getObjectInstance(EJBLinkObjectFactory.java:167)
我希望有人可以帮我解决这个问题并解释如何将远程EJB注入和查找,如果它位于单独的EAR文件中。
这是我的设置:
1)BelgianBeersEJMProjectClient(包含接口的ejb客户端项目)
package com.ejb.view;
public interface BelgianBeerSessionInterface {
List<Country> getAllCountries();
void saveCountries(List<Country> countries);
}
package com.ejb.view;
@Remote
public interface BelgianBeerSessionBeanRemote extends
BelgianBeerSessionInterface {
}
2)BelgianBeersEJBProject(包含ejb实现)
package com.ejb;
@Stateless
public class BelgianBeerSessionBean implements BelgianBeerSessionBeanRemote,
BelgianBeerSessionBeanLocal {
public BelgianBeerSessionBean() {
// TODO Auto-generated constructor stub
}
public List<Country> getAllCountries() {
//to be implemented
return null;
}
public void saveCountries(List<Country> countries) {
//to be implemented
}
}
同样在META-INF中有一个ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
<display-name>BelgianBeersEJBProject </display-name>
<ejb-client-jar>BelgianBeersEJBProjectClient.jar</ejb-client-jar>
</ejb-jar>
3)BelgianBeersWebProject - 包含jsf app
@ManagedBean
@ViewScoped
public class BeerStorePageBean {
@EJB(name="EJB/BelgianBeerSessionBean")
private BelgianBeerSessionBeanRemote store;
public BelgianBeerSessionBeanRemote getStore() {
return store;
}
public void setStore(BelgianBeerSessionBeanRemote store) {
this.store = store;
}
private List<Country> countries = null;
@PostConstruct
public void populateCountries(){
System.out.println("Store = " + store);
countries = store.getAllCountries();
}
public List<Country> getAllCountries() {
return countries;
}
}
并且在web.xml中有一个ejb条目:
<ejb-ref>
<description />
<ejb-ref-name>EJB/BelgianBeerSessionBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home />
<remote>com.ejb.view.BelgianBeerSessionBeanRemote</remote>
</ejb-ref>
EAR file 1 (BelgianBeersEARProject.ear) contains:
1) BelgianBeersEJBProject.jar
2) BelgianBeersEJBProjectClient.jar
EAR file 2 (BeerStoreWebEAR.ear) contains:
1. BeerStoreWebProject.war
2. BelginaBeersEJBProjectClient.jar
请有人向我解释调用远程EJB的正确方法,该远程EJB位于单独的EAR文件中。请帮忙!我正在撕扯我的头发!
答案 0 :(得分:1)
@EJB注释(以及XML中相应的<ejb-ref>
)仅在目标EJB位于同一应用程序中时才会自动链接。来自javadoc:
如果没有提供明确的链接信息且只有一个 会话bean在同一个应用程序中公开匹配 客户端视图类型,默认情况下,EJB依赖关系解析为该类型 会话bean。
要链接到另一个应用程序中的EJB,您需要指定绑定。您可以通过以下几种方式实现此目的:
<lookup-name>targetBindingName</lookup-name>
中指定<ejb-ref>
。<ejb-ref name="EJB/BelgianBeerSessionBean" binding-name="targetBindingName"/>
文件中指定WEB-INF/ibm-web-bnd.xml
。有关绑定文件格式的更多信息,请参阅InfoCenter。在任何情况下,您都需要目标EJB的绑定名称。上面的InfoCenter链接描述了“经典”WebSphere Application Server绑定名称和Java EE 6标准“java:global”名称。前者可以在ibm-ejb-jar-bnd.xml
中配置,而后者则不能(除了指定备用<application-name>
或<module-name>
)之外,但您使用哪个并不重要。要查找正在使用的名称,最简单的方法是启动EJB应用程序,然后查找EJB容器启动时打印的CNTR0167I
消息(第一个是“经典”绑定):
[6/6/13 17:26:04:531 CDT] 00000049 WASNameSpaceB I CNTR0167I: The server is binding the javax.management.j2ee.ManagementHome interface of the Management enterprise bean in the mejb.jar module of the ManagementEJB application. The binding location is: ejb/mgmt/MEJB
[6/6/13 17:26:04:544 CDT] 00000049 AbstractEJBRu I CNTR0167I: The server is binding the javax.management.j2ee.ManagementHome interface of the Management enterprise bean in the mejb.jar module of the ManagementEJB application. The binding location is: java:global/ManagementEJB/mejb/Management!javax.management.j2ee.ManagementHome