首先,我想告诉我这里提出了类似的问题,但我仍无法找到解决问题的方法。
我有一个 EJB 3 项目(名称= HelloWorldEJBProject)。在那里,我创建了一个无状态远程EJB(name = HelloWorldEJB)。我还在那里创建了一个远程接口(name = HelloWorldEJBInterfaceRemote)。在那之后我创造了一个罐子&用蚂蚁编译后的所有内容。然后我在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问题。
答案 0 :(得分:0)
开始获取NamingException
后,使用com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote
作为JNDI
查找字符串应该有效。你也尝试过使用它吗?