【问题标题】:EJB Lookup Issue with WebSphere Application Server 6.1WebSphere Application Server 6.1 的 EJB 查找问题
【发布时间】: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


【解决方案1】:

在您开始获取NamingException 之后,使用com.staples.ejb.interfaces.HelloWorldEJBInt‌​erfaceRemote 作为您的JNDI 查找字符串应该可以工作。你也尝试过使用它吗?

【讨论】: