当前位置: 首页 > 知识库问答 >
问题:

尝试在WebSphere Liberty 8.5.5.8中绑定EJB时出错

皇甫心思
2023-03-14

背景:我继承了一个利用EJB的古老应用程序。在项目的方面,它被列为3.0EJB。EJB是在运行WebSphere6.1时编写的,我们有两个JVM,一个用于UI/表示层,另一个JVM托管EJB/“数据层”,该JVM也使用JPA。我们正在迁移到WebSphere Liberty 8.5.5.8,当我启动应用程序并访问它时,我遇到以下异常:

....
Caused by: 
com.ibm.wsspi.injectionengine.InjectionException: CWNEN0030E: The server was unable to obtain an object instance for the java:comp/env/ejb/CHServiceBean reference.  The exception message was: CWNEN1003E: The server was unable to find the com.xxx.xxx.service.CHServiceRemote binding with the com.xxx.xxx.service.CHService type for the java:comp/env/ejb/CHServiceBean reference.
    at com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1458)
    at com.ibm.ws.ejb.injection.processor.EJBInjectionBinding.getInjectionObject(EJBInjectionBinding.java:1047)
    at com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1389)
    at com.ibm.ws.injectionengine.osgi.internal.naming.InjectionJavaColonHelper.getObjectInstance(InjectionJavaColonHelper.java:116)
    ... 44 more
Caused by: 
com.ibm.wsspi.injectionengine.InjectionException: CWNEN1003E: The server was unable to find the com.xxx.xxxx.service.CHServiceRemote binding with the com.xxx.xxxxx.service.CHService type for the java:comp/env/ejb/CHServiceBean reference.
    at com.ibm.ws.injectionengine.osgi.internal.IndirectJndiLookupObjectFactory.getObjectInstance(IndirectJndiLookupObjectFactory.java:202)

下面是访问上下文对象的代码:提供的失败字符串jndiName是:“java:comp/env/ejb/CHServiceBean”

public Object getResource(String jndiName) throws Exception {
    Object obj = null;
    if (obj == null) {
        try {
            obj = new InitialContext().lookup(jndiName);
            return obj;
        } catch (Exception e) {
            XXXXXX.error("ServiceLocator.getResource(...) ERROR, "");
            throw e;
        }
    }
    return obj;
}

我们有两个打包的EAR文件,Ear文件A称为(CHNew.ear),其中包含一个名为CHNew.war的. war,其中包含大部分前端逻辑,并且在部署程序集中引用了CHService.jar文件。Ear文件B称为(CHService.ear),其中包含名为CHService.war.的war项目中的EJB代码。它们都驻留在同一个应用程序服务器上,因此是同一个jvm,但显然没有打包在同一个earfile中。

Ear A具有以下web.xml片段:

<ejb-ref id="EjbRef_1430884948507">
  <description>
  </description>
  <ejb-ref-name>ejb/CHServiceBean</ejb-ref-name>
  <ejb-ref-type>Session</ejb-ref-type>
  <home>com.xxx.xxx.service.CHService</home>
  <remote>com.xxx.xxx.service.CHServiceRemote</remote>
</ejb-ref>
<ejb-ref id="EjbRef_1430885115133">
  <ejb-ref-name>ejb/CHServiceBeanRO</ejb-ref-name>
  <ejb-ref-type>Session</ejb-ref-type>
  <home>com.xxx.xxxx.service.CHServiceRO</home>
  <remote>com.xxx.xxx.service.CHServiceRemoteRO</remote>
</ejb-ref>

编辑:以下是.xml文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<webappbnd:WebAppBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:webappbnd="webappbnd.xmi" xmi:id="WebAppBinding_1430419801447" virtualHostName="default_host">
  <webapp href="WEB-INF/web.xml#WebApp_ID"/>
  <resRefBindings xmi:id="ResourceRefBinding_1430749102271" jndiName="services/cache/CHContacts">
    <bindingResourceRef href="WEB-INF/web.xml#ResourceRef_1430749102271"/>
  </resRefBindings>
  <resRefBindings xmi:id="ResourceRefBinding_1436377001246" jndiName="jdbc/nextgen">
    <bindingResourceRef href="WEB-INF/web.xml#ResourceRef_1436377001246"/>
  </resRefBindings>
  <resRefBindings xmi:id="ResourceRefBinding_1436377001247" jndiName="jdbc/nextgen_RO">
    <bindingResourceRef href="WEB-INF/web.xml#ResourceRef_1436377001247"/>
  </resRefBindings>
  <resRefBindings xmi:id="ResourceRefBinding_1456409466488" jndiName="services/cache/CHGeneric">
    <bindingResourceRef href="WEB-INF/web.xml#ResourceRef_1456409466488"/>
  </resRefBindings>
  <ejbRefBindings xmi:id="EjbRefBinding_1430884948507" jndiName="com.xxx.xxx.service.CHServiceRemote">
    <bindingEjbRef href="WEB-INF/web.xml#EjbRef_1430884948507"/>
  </ejbRefBindings>
  <ejbRefBindings xmi:id="EjbRefBinding_1430885115133" jndiName="com.xxx.xxx.service.CHServiceRemoteRO">
    <bindingEjbRef href="WEB-INF/web.xml#EjbRef_1430885115133"/>
  </ejbRefBindings>
</webappbnd:WebAppBinding>

*有来自过去的绑定.xmi(注意不是.xml)文件,我认为被忽略了吗?

在Ear App B中有一个ibm ejb jar bnd。包含以下节的xml文件:

<session name="CHServiceBean">
  <resource-ref name="jdbc/db" binding-name="jdbc/db"></resource-ref>
  <resource-ref name="services/cache/CacheA" binding-name="services/cache/CHBluepages"></resource-ref>
  <resource-ref name="services/cache/CacheB" binding-name="services/cache/CHGeneric" ></resource-ref>
</session>

<session name="CHServiceBeanRO">
  <resource-ref name="jdbc/db_RO"
      binding-name="jdbc/db_RO">
  </resource-ref>
  <resource-ref name="jdbc/db" binding-name="jdbc/db"></resource-ref>
  <resource-ref name="services/cache/CHGeneric" binding-name="services/cache/CHGeneric"></resource-ref>
  <resource-ref name="services/cache/CacheA" binding-name="services/cache/CacheB"></resource-ref>
</session>

这是我的自由server.xml档案:

<!-- Enable features -->
    <featureManager>
        <feature>javaee-7.0</feature>
        <feature>localConnector-1.0</feature>
        <feature>distributedMap-1.0</feature>
        <feature>adminCenter-1.0</feature> 
        <feature>ssl-1.0</feature>
        <feature>usr:webCacheMonitor-1.0</feature>
        <feature>webCache-1.0</feature>
        <feature>ldapRegistry-3.0</feature>
    </featureManager>

    <!--  Admin Center Config Start -->
    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint host="*" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>

    <keyStore id="defaultKeyStore" password="xxxxxx"/> 

    <basicRegistry id="basic"> 
          <user name="wpsadmin" password="xxxxxx"/> 
    </basicRegistry> 

    <administrator-role> 
      <user>wpsadmin</user>
    </administrator-role>

    <remoteFileAccess> 
       <writeDir>${server.config.dir}</writeDir> 
    </remoteFileAccess>

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>
    <applicationMonitor updateTrigger="mbean"/>

    <enterpriseApplication id="CHNewCHRDMEAR" location="CHNewCHRDMEAR.ear" name="CHNewCHRDMEAR">
        <application-bnd>
            <security-role name="AllAuthenticated">
                <special-subject type="ALL_AUTHENTICATED_USERS"/>
            </security-role>
        </application-bnd>
    </enterpriseApplication>
    <enterpriseApplication id="CHServiceEAR" location="CHServiceEAR.ear" name="CHServiceEAR"/>

    <!--  JAAS Authentication Alias (Global) Config -->
    <authData id="r4dba" password="{xor}MzhmJT06ajI=" user="r4dba"/>

    <!--  JDBC Driver and Datasource Config -->
    <library id="DB2JCC4Lib">
        <fileset dir="C:\DB2\Jars" includes="db2jcc4.jar db2jcc_license_cisuz.jar"/>
    </library>
</server>

问题:

  1. 我还需要做些什么来绑定此 EJB?
  2. 我尝试过使用 java:全局命名空间来引用具有以下 JNDI 名称的两个 EJB(在同一 EJB 应用程序中)(这些名称都引发了 JNDI 命名异常):
    1. java:global/CHServiceEAR/CHService/CHServiceBean!com.xxx.xxx.service.CHSerivceBean
    2. java:global/CHServiceEAR/CHService/CHServiceBean

共有1个答案

利思源
2023-03-14

您已经显示了ibm-ejb-jar-bnd.xml,但需要显示来自CHNew.war.的ibm-web-bnd.xml。错误消息提示您配置了如下绑定:

<ejb-ref name="ejb/CHServiceBean" binding-name="com.xxx.xxx.service.CHServiceRemote">

...或者类似这样的东西,如果你使用的是:

  <ejbRefBindings xmi:id="EjbRefBinding_1430884948507" jndiName="com.xxx.xxx.service.CHServiceRemote">
    <bindingEjbRef href="WEB-INF/web.xml#EjbRef_1430884948507"/>
  </ejbRefBindings>

Liberty配置文件只将EJB绑定到< code>java:名称空间,而从不绑定到默认名称空间(包括像< code > com . XXX . XXX . service . chserviceremote 这样的名称),所以这个查找总是会失败。请参阅知识中心中Liberty主题的使用enterprise JavaBeans远程接口的“命名”部分。您需要将绑定名称更新为类似于< code > Java:global/ch service/ch service/ch servicebean 的名称。有关要使用的确切字符串,请参见messages.log中的CNTR0167I消息。

 类似资料:
  • 我试图在Ubuntu16.04LTS中安装docker datage,Apache侦听端口80和443。 当我尝试午餐应用程序时,我得到以下错误: 启动现有容器+/usr/bin/docker启动应用程序错误响应:驱动程序在endpoint应用程序上编程外部连接失败(dade361e77fbf29f4d9667febe57a06f168f916148e10cc1365093d8f97026bb):

  • 我正在编写一个小型测试应用程序,该应用程序使用Scala中的类和。问题在于: 抛出错误: 我不明白为什么当这个完全相同的片段出现在方法中时会编译,而当它出现在对象的代码中时却不会编译。 顺便说一句,在浏览了大量ScalaFX代码之后,我有些头晕,因为我已经看到了许多绑定到事件的不同方法,我正在使用的就是一种,使用FilterEvent设置onMouseClicked变量(有和没有第一类函数)。另外

  • 我得到错误,而试图通过捆绑通过数组列表请帮助 JAVAlang.RuntimeException:无法启动活动组件信息{com.sandyzfeaklab.Breakdown_app/com.sandyzfeaklab.Breakdown_app.Data_input}:java。lang.NullPointerException:尝试调用虚拟方法“java”。木卫一。可序列化的android。操

  • 尝试在angular 4中实现滑块。 下面是Slider.Component.ts null null 下面是slider.component.html null null 它抛出data-thumb属性的模板解析错误。 Data-thumb属性随主题一起提供,以实现滑块。在控制台抛出以下错误代码段。 null null 0:{ID:3,标题:“Banner-3”,URL:“23”,映像:“Res

  • 我已经在应用程序中添加了一个sqlite文件,并试图将其从bundle复制到documents目录。我还将sqlite添加到了target应用程序中。下面是我用来复制文件的代码: 的代码: Error domain=nscocoaerrordomain code=4“文件”myapp.sqlite“不存在。”userInfo={nsSourceFilePatherRokey=/users/hari

  • 我已经编写了一个简单的 RMI 应用程序,但我无法将远程对象绑定到 RMI 注册表。RMI 注册表从单独的 cmd 窗口 [我在 Windows 10] 运行。远程界面非常简单: 实现也很简单: 下面是服务器,其中包含 main 方法: 当我[从Eclipse内部]运行它时,我得到 我真的不知道这是从哪里来的。我甚至还没有调用客户端...