WebSphere Application Server 6.1的EJB查找问题

时间:2015-06-10 12:49:22

标签: java-ee ejb-3.0 jndi websphere-6.1 ejb-2.x

首先,我想告诉我这里提出了类似的问题,但我仍无法找到解决问题的方法。

我有一个 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问题。

1 个答案:

答案 0 :(得分:0)

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