在WAS 8上的另一个EAR文件中,从单独的EAR文件中调用远程EJB3

时间:2013-06-05 14:57:37

标签: jsf-2 ejb ejb-3.0 websphere-8

我是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文件中。请帮忙!我正在撕扯我的头发!

1 个答案:

答案 0 :(得分:1)

@EJB注释(以及XML中相应的<ejb-ref>)仅在目标EJB位于同一应用程序中时才会自动链接。来自javadoc:

  

如果没有提供明确的链接信息且只有一个   会话bean在同一个应用程序中公开匹配   客户端视图类型,默认情况下,EJB依赖关系解析为该类型   会话bean。

要链接到另一个应用程序中的EJB,您需要指定绑定。您可以通过以下几种方式实现此目的:

  1. 在ejb-jar.xml中的<lookup-name>targetBindingName</lookup-name>中指定<ejb-ref>
  2. 在包含ejb-ref的WAR模块的<ejb-ref name="EJB/BelgianBeerSessionBean" binding-name="targetBindingName"/>文件中指定WEB-INF/ibm-web-bnd.xml。有关绑定文件格式的更多信息,请参阅InfoCenter
  3. 在应用程序部署期间指定目标绑定名称(即,不要“使用默认绑定”)。
  4. 在任何情况下,您都需要目标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