gpt4 book ai didi

java - 在 websphere 中查找本地 EJB 的正确方法 - 获取 ClassCastException

转载 作者:行者123 更新时间:2023-12-01 22:06:45 25 4
gpt4 key购买 nike

我有一个由本地和远程接口(interface)公开的 EJB

package com.sam.enqueue;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Singleton;

@Singleton
@Local(SamEnqueueLocal.class)
@Remote(SamEnqueueRemote.class)
public class SamEnqueue implements SamEnqueueRemote, SamEnqueueLocal {


}


// remote interface
package com.sam.enqueue;

import javax.ejb.Remote;

@Remote
public interface SamEnqueueRemote {


}

// local interface
package com.sam.enqueue;

@Local
public interface SamEnqueueLocal {



}

我的应用程序容器是 websphere 8.0,我不会覆盖服务器分配的默认 JNDI 名称。在服务器启动期间,我在日志中获得以下默认绑定(bind):

CNTR0167I: The server is binding the com.sam.enqueue.SamEnqueueRemote interface of the SamEnqueue enterprise bean in the SAM_ENQUEUE.jar module of the SAM_ENQUEUE application.  The binding location is: ejb/SAM_ENQUEUE/SAM_ENQUEUE.jar/SamEnqueue#com.sam.enqueue.SamEnqueueRemote
CNTR0167I: The server is binding the com.sam.enqueue.SamEnqueueRemote interface of the SamEnqueue enterprise bean in the SAM_ENQUEUE.jar module of the SAM_ENQUEUE application. The binding location is: com.sam.enqueue.SamEnqueueRemote
CNTR0167I: The server is binding the com.sam.enqueue.SamEnqueueRemote interface of the SamEnqueue enterprise bean in the SAM_ENQUEUE.jar module of the SAM_ENQUEUE application. The binding location is: java:global/SAM_ENQUEUE/SamEnqueue!com.sam.enqueue.SamEnqueueRemote
CNTR0167I: The server is binding the com.sam.enqueue.SamEnqueueLocal interface of the SamEnqueue enterprise bean in the SAM_ENQUEUE.jar module of the SAM_ENQUEUE application. The binding location is: ejblocal:SAM_ENQUEUE/SAM_ENQUEUE.jar/SamEnqueue#com.sam.enqueue.SamEnqueueLocal
CNTR0167I: The server is binding the com.sam.enqueue.SamEnqueueLocal interface of the SamEnqueue enterprise bean in the SAM_ENQUEUE.jar module of the SAM_ENQUEUE application. The binding location is: ejblocal:com.sam.enqueue.SamEnqueueLocal
CNTR0167I: The server is binding the com.sam.enqueue.SamEnqueueLocal interface of the SamEnqueue enterprise bean in the SAM_ENQUEUE.jar module of the SAM_ENQUEUE application. The binding location is: java:global/SAM_ENQUEUE/SamEnqueue!com.sam.enqueue.SamEnqueueLocal

查找类只是同一服务器中不同 EAR 中的一个简单 java 类,代码如下:

Context ctx = new InitialContext();
Object local = ctx.lookup("java:global/SAM_ENQUEUE/SamEnqueue!com.sam.enqueue.SamEnqueueLocal");

SamEnqueueLocal samEnqueue = (SamEnqueueLocal) local;

查找正在使用本地的三个 JNDI 名称中的任何一个,但它没有转换为 SamEnqueueLocal。异常跟踪是:

SystemErr     R java.lang.ClassCastException: com.sam.enqueue.EJSLocal0SGSamEnqueue_cf56ba6f incompatible with com.sam.enqueue.SamEnqueueLocal

... rest ommited

我创建了一个共享库并将目标 EAR 的 stub 放入其中。该库是源查找 EAR 的类路径,具有首先使用本地类加载器加载的类(最后是父级) 策略。图书馆并不是孤立的。如果删除 stub ,我会按预期得到 java.lang.ClassNotFoundException: com.sam.enqueue.SamEnqueueLocal

更新:

使用依赖注入(inject)时:

@EJB(lookup="ejblocal:com.sam.enqueue.SamEnqueueLocal")
private SamEnqueueLocal samEnqueueLocal;

我得到的错误是:

javax.ejb.EJBException: Injection failure; nested exception is: java.lang.IllegalArgumentException: Can not set com.sam.enqueue.SamEnqueueLocal field com.some.SomeBean.samEnqueueLocal to com.sam.enqueue.EJSLocal0SGSamEnqueue_cf56ba6f
Caused by: java.lang.IllegalArgumentException: Can not set com.sam.enqueue.SamEnqueueLocal field com.some.SomeBean.samEnqueueLocal to com.sam.enqueue.EJSLocal0SGSamEnqueue_cf56ba6f

所以基本上是一样的。

最佳答案

您收到 java.lang.ClassCastException 是因为您正在检索对 EJB 的引用,该 EJB 存在于与正在尝试的部署单元(ejb-jar、war 等)不同的类加载器中注入(inject)它。

如果可能的话,在应用程序之间使用本地 EJB 引用取决于供应商。您可以将 SamEnqueue bean 部署在单独的 EJB 模块中,并尝试通过每个应用程序的 list Class-Path: 条目引用它。确保任一 EAR 文件中都没有 SamEnqueueLocal 的副本。

或者,只需使用 SamEnqueueRemote 接口(interface)。

请参阅 Java EE specification 的第 8 章了解更多信息。

关于java - 在 websphere 中查找本地 EJB 的正确方法 - 获取 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32603933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com