【发布时间】:2015-06-10 12:49:21
【问题描述】:
起初我想告诉大家,这里已经提出了类似类型的问题,但我仍然找不到我的问题的解决方案。
我有一个 EJB 3 项目(名称 = HelloWorldEJBProject)。在那里,我创建了一个无状态的远程 EJB(名称 = HelloWorldEJB)。我还在那里创建了一个远程接口(名称= HelloWorldEJBInterfaceRemote)。之后,我在使用 ant 编译所有内容后创建了一个 jar 和一个项目的耳朵。然后我在 WebSphere Application Server 6.1 中部署了 EAR。
接下来我还创建了一个独立的java项目(name = HelloWorldClient),把HelloWorldEJBProject的jar放到这个项目的构建路径下。现在,当我进行查找时,我遇到了错误。
HelloWorldEJB.java:
package com.staples.ejb;
import com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote;
import javax.ejb.Stateless;
@Stateless
public class HelloWorldEJB implements HelloWorldEJBInterfaceRemote {
public HelloWorldEJB() {
}
public String helloWorld() {
return "Hello World";
}
}
Client.java(HelloWorldClient 项目内部):
package com.staples.client.processor;
import com.staples.client.util.ApplicationUtil;
import com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote;
public class Client {
static private HelloWorldEJBInterfaceRemote helloInterface = ApplicationUtil.getHelloEJBHandle();
public static void main(String[] args) {
System.out.println(helloInterface.helloWorld());
}
}
ApplicationUtil.java(在 HelloWorldClient 项目中):
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote;
public class ApplicationUtil {
public static Object getContext(){
Object obj = null;
Context context;
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL,"corbaloc:iiop:localhost:2811");
Context ctx = new InitialContext(env);
obj = ctx.lookup("ejb/HelloEAR/Hello.jar/HelloWorldEJB#" + HelloWorldEJBInterfaceRemote.class.getName());
} catch (NamingException e) {
e.printStackTrace();
}
return obj;
}
public static HelloWorldEJBInterfaceRemote getHelloEJBHandle()
{
Object obj = getContext();
HelloWorldEJBInterfaceRemote helloInterface = (HelloWorldEJBInterfaceRemote) PortableRemoteObject.narrow(obj, HelloWorldEJBInterfaceRemote.class);
//HelloWorldEJBInterfaceRemote helloInterface = (HelloWorldEJBInterfaceRemote) obj;
return helloInterface;
}
错误:
Exception in thread "P=141210:O=0:CT" java.lang.ClassCastException: Unable to load class: com.staples.ejb.interfaces._HelloWorldEJBInterfaceRemote_Stub
at com.ibm.rmi.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:372)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:156)
at com.staples.client.util.ApplicationUtil.getHelloEJBHandle(ApplicationUtil.java:41)
at com.staples.client.processor.Client.main(Client.java:14)
如果我评论以下内容
HelloWorldEJBInterfaceRemote helloInterface = (HelloWorldEJBInterfaceRemote) PortableRemoteObject.narrow(obj, HelloWorldEJBInterfaceRemote.class);
& 取消注释以下内容:
HelloWorldEJBInterfaceRemote helloInterface = (HelloWorldEJBInterfaceRemote) obj;
然后出现以下错误:
Exception in thread "P=346416:O=0:CT" java.lang.ClassCastException: org.omg.stub.java.rmi._Remote_Stub incompatible with com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote
at com.staples.client.util.ApplicationUtil.getHelloEJBHandle(ApplicationUtil.java:42)
at com.staples.client.processor.Client.main(Client.java:14)
我正在使用 EJB 3 所以我想我不需要 PortableRemoteObject.narrow 但不使用它我会得到不同的错误。我也不确定要写什么作为 context.lookup() 的参数。我是 EJB 的新手。有人可以帮我吗?提前致谢。感谢 MagicWand 和 bkail 解决了我的端口和 jndi 问题。
【问题讨论】:
-
您从哪台机器上运行您的客户端?它是否在 WAS 所在的同一台机器上?如果不是,那么您必须修改 ApplicationUtil 以指向正确的机器以进行 JNDI 查找(例如 corbaloc:iiop:was_machine:2809)。另一个问题可能与端口有关:2809 是默认的 IIOP 端口,但它是在创建 WAS 配置文件时设置的。请检查 WAS 上的 IIOP 端口。
-
是的,客户端与 WAS 位于同一台机器上。在我的 websphere 管理控制台中,BOOTSTRAP_ADDRESS 端口是 2811。这是您所说的端口吗?因为我看不到任何名为 IIOP 的端口。 @MagicWand
-
将其更改为 2811 后,之前的错误解决了。新错误是:javax.naming.NameNotFoundException:上下文:VDIPN5243Node03Cell/nodes/VDIPN5243Node03/servers/server1,名称:ejb/HelloEAR/Hello.jar/HelloWorldEJB/com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote:名称中的第一个组件 HelloWorldEJB/ com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote 未找到。 [根例外是 org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]
-
在 SystemOut.log 中查找 CNTR0167I 消息。如果应用程序正确启动,这些消息将包含 EJB 的正确 JNDI 名称。
-
我可以在该日志中找到的唯一内容: CNTR0167I:服务器正在绑定 HelloEAR 应用程序的 Hello.jar 模块中的 HelloWorldEJB 企业 bean 的 HelloWorldEJBInterfaceRemote 接口。绑定位置为:ejb/HelloEAR/Hello.jar/HelloWorldEJB#com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote @bkail
标签: jakarta-ee ejb-3.0 jndi websphere-6.1 ejb-2.x