【问题标题】:Same stateless bean in two ears两个耳朵里的同一个无状态bean
【发布时间】:2014-09-23 14:57:09
【问题描述】:

我有相同的 EJB 模块,其中一个 EAR 是服务器端,一个 EAR 是客户端。 我能有这种情况吗?

因为我收到此错误http://justpaste.it/gfs3 不知道如何解决它。

【问题讨论】:

    标签: ejb ejb-3.0 jndi websphere-7


    【解决方案1】:

    在我的情况下:- 我确实安装了 abc.ear 和 xyz.ear 两个耳朵是独立的,相互依赖。

    我正在使用客户端查找调用 abc.ear,但这给了我

    com.ibm.websphere.naming.CannotInstantiateObjectException:当 JNDI NamingManager 处理 javax.naming.Reference 对象时发生异常。 [根异常是 com.ibm.websphere.ejbcontainer.AmbiguousEJBReferenceException:短格式默认绑定 'com.ejb.abc' 是模棱两可的,因为多个 bean 实现了接口: [xyz-ear#rabc-ejb-1.0.jar#abcInrerfaceImpl, rabc-ear#rabc-ejb-1.0.jar

    abcInrerfaceImpl]。提供特定于接口的绑定或在查找时使用长格式默认绑定。]

    我的解决方案是:-

    我删除了另一个应用程序中的 abc.jar (xyz.ear) C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\wstemp\92668751\workspace\cells\mypc00Node01Cell\applications\xyz-ear.ear '

    然后解决方案客户端查找工作正常。

    为避免将来出现这种情况,最好在 IBM-WAS 服务器上创建单独的节点并将这两个应用程序安装在不同的节点上。

    所以两个应用程序组件都不会搞砸。

    【讨论】:

      【解决方案2】:

      您在堆栈跟踪中有答案:

      The short-form default binding 'com.demo.view.RitornaPersonaRemote' 
      is ambiguous because multiple beans implement the interface : 
      [RitornaPersonaSenzaClientEAR#RitornaPersonaSenzaClient.jar#RitornaPersona, 
      RitornaPersonaWebSenzaClientEAR#RitornaPersonaSenzaClient.jar#RitornaPersona]. 
      Provide an interface specific binding or use the long-form default binding on lookup.]
      

      如果您问是否可能在多个项目中拥有相同的 EJB jar - 答案是肯定的。但是,在部署期间,您必须使用长格式 JNDI,为其他模块中的 bean 提供不同的 JNDI 名称或禁用短名称。您不能以相同的名称注册两个 bean。

      长名称的格式为RitornaPersonaSenzaClientEAR#RitornaPersonaSenzaClient.jar#com.demo.view.RitornaPersonaRemote

      在此处查看详细信息 - EJB 3.0 and EJB 3.1 application bindings overview

      更新

      要禁用短名称,请执行以下步骤:

      • 转到Application servers > server1 > Process definition > Java Virtual Machine > Custom properties
      • 定义新的自定义属性 com.ibm.websphere.ejbcontainer.disableShortDefaultBindings 与值 * 以禁用所有应用的短绑定或 AppName1|AppName2 仅禁用选定应用中的短绑定。

      SystemOut.log 中显示了示例默认绑定:

      The binding location is: ejblocal:JPADepEar/JPADepEJB.jar/TableTester#ejb.TableTester
      The binding location is: ejblocal:ejb.TableTester
      The binding location is: java:global/JPADepEar/JPADepEJB/TableTester!ejb.TableTester
      

      并且设置了disableShortDefaultBindings 属性后,没有短格式:

      The binding location is: ejblocal:JPADepEar/JPADepEJB.jar/TableTester#ejb.TableTester
      The binding location is: java:global/JPADepEar/JPADepEJB/TableTester!ejb.TableTester
      

      文档中有一个错误,正确的属性是 com.ibm.websphere.ejbcontainer.disableShortDefaultBindings 而不是 com.ibm.websphere.ejbcontainer.disableShortFormBinding

      【讨论】:

      • 如何在 websphere 7 中更改 JNDI?我看了这个答案stackoverflow.com/questions/13738457/…,但没有任何改变
      • 在应用程序上下文中我有
      • 那很好,但在这种情况下,您需要使用 JVM 自定义属性禁用短名称 - com.ibm.websphere.ejbcontainer.disableShortDefaultBindings 或通过 ibm-ejb-jar-bnd.xml 文件或管理控制台应用程序 > yourApp > 为这些 bean 定义自定义名称绑定 EJB 业务,然后在每个应用上下文中更改名称。
      • 因此,您是说我必须创建一个名为ibm-ejb-jar-bnd.xml 的新文件并插入<session name="rp"> <interface class="com.demo.view.RitornaPersonaRemote" binding-name="RitornaPersonaSenzaClientEAR#RitornaPersonaSenzaClient.jar#com.demo.view.RitornaPersonaRemote"/> </session> ,对吗?我试过了,但我遇到了同样的错误,还有“RP”。
      • 我首先尝试通过自定义属性禁用短名称,然后查看错误是否消失。应该更简单,无需对您的代码进行任何更改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多