代码之家  ›  专栏  ›  技术社区  ›  MaxG

EJB 3.2-无法正确配置远程客户端

  •  0
  • MaxG  · 技术社区  · 10 年前

    我是EJB新手,为了演示目的,我编写了一个非常小的EJB组件。它要做的就是打印“你好”。当前正在努力正确配置远程客户端的InitialContext。我使用的容器是JBoss 7.0。我使用JaveEE7.0和ejb3.2。

    ejb的接口:

    package hello;
    
    public interface Hello {
    
        public String sayHello(String name);
    }
    

    bean本身:

    package hello;
    
    import javax.ejb.Remote;
    import javax.ejb.Stateless;
    
    @Stateless(name="HelloEJB")
    @Remote(Hello.class)
    public class HelloBean implements Hello {
    
        @Override
        public String sayHello(String name) {
            return "Hello, " + name;
        }
    
    }
    

    还有我放在EJB项目中但作为java应用程序运行的远程客户端:

    package client;
    
    import hello.Hello; 
    
    import java.util.Properties;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.rmi.PortableRemoteObject;
    
    public class Test {
    
        public static void main(String[] args) {
    
            Hello statelessHello = null;
            try {
                statelessHello = lookupStatelessHello(); // the method that throws exception
            } catch (NamingException e) {
                System.out.println("Bean Loading Failed");
                e.printStackTrace();
                Thread.currentThread().stop();
            }       
            Hello stub=(Hello)PortableRemoteObject.narrow(statelessHello, Hello.class);
            System.out.println("obtained a remote stateless hello for invocation");
            System.out.println(stub.sayHello(args[0]));
        }
    
    
    
        private static Hello lookupStatelessHello() throws NamingException {
        // the problematic code:
                Properties jndiProperties = new Properties();
                jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
                jndiProperties.put(Context.PROVIDER_URL,"remote://localhost:4447"); // tried to change ports.
                jndiProperties.put("jboss.naming.client.ejb.context", true);
                Context context = new InitialContext(jndiProperties); // exception happens here
                return (Hello) context.lookup("stateless1/HelloEJB!hello.Hello");
            }
        }
    

    当我运行JBoss时,我可以毫无问题地部署我的ejb项目:

    13: 37:2041信息[org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC服务线程1-6)名为HelloEJB的会话bean的JNDI绑定 在部署单元中,部署“无状态1.jar”如下:

    java:全局/无状态1/HelloEJB!你好,你好 java:app/无状态1/HelloEJB!你好,你好 java:module/HelloEJB!你好,你好
    java:全局/无状态1/HelloEJB java:app/无状态1/HelloEJB
    java:模块/HelloEJB

    13: 37:20255信息[org.jboss.as.server.controller] (DeploymentScanner线程-2)已部署的“无状态1.jar”

    但当我尝试从远程客户端调用ejb时,我会得到:

    Bean加载失败javax.naming。NoInitialContextException:无法实例化类: org.jboss.naming.remote.client。InitialContextFactory[根异常 是java.lang.ClassNotFoundException: org.jboss.naming.remote.client。InitialContextFactory]位于 javax.naming.spi.NamingManager。getInitialContext(未知源)位于 javax.naming.InitialContext。getDefaultInitCtx(未知源)位于 javax.naming.InitialContext。init(未知源)位于 javax.naming.InitialContext。(未知源)位于 client.Test.lookupStatelesHello(Test.java:34)位于 client.Test.main(Test.java:18)原因: java.lang.ClassNotFoundException: org.jboss.naming.remote.client。InitialContextFactory位于 java.net.URLClassLoader。findClass(未知源)位于 java.lang.ClassLoader。loadClass(未知源)位于 sun.misc.Launcher$AppClassLoader。loadClass(未知源)位于 java.lang.ClassLoader。loadClass(未知源)位于 java.lang.Class类。forName0(本机方法)

    我尝试过更改端口,尝试过添加安全凭据,但我不知道如何添加用户,尝试过阅读指南,但坦率地说,因为我是新手。这对我来说很难。此外,我很确定我查找bean的方式是错误的,但现在不是问题所在。

    我希望你能帮我找到我在这里做错的事情。如果您需要更多关于设置的信息,只需询问。

    3 回复  |  直到 10 年前
        1
  •  1
  •   javapapo    10 年前

    如上所述,您需要jboss客户端。jar与您的代码一起使用,以使其工作。具体的罐子可以在

    JBOSS_HOME/bin/client/jboss-client-7.1.0.Final.jar.
    

    另外,请查看官方文档和wiki,以及完整的示例。看见 here .

        2
  •  1
  •   Steve C    10 年前

    客户端的类路径中缺少类。

    查看$JBOSS_HOME/bin/client/README-EJB-JMS。txt文件,以获取有关您需要在客户端中包含哪些jar的信息。

        3
  •  0
  •   Ani    6 年前
    1. 确保 client*.jar 在我的情况下是在你的类路径中 gf-client.jar ,因为使用的是玻璃鱼而不是JBoss。
    2. 客户端代码更改读取注释2种查找方式。。。
    3. ejb Stateless(name=“HelloWorldEJB”,mappedName=“HelloEJB”)只能与名称一起使用,因为它是可移植的,并且mappedName是供应商锁定的,不鼓励使用,因为我只将其用于说明目的。
    4. 此外,我还没有在同一个容器中设置jndi属性。

    Context context = new InitialContext();

    1. 代码更改后重新部署或重新启动JBoss。

    工作代码如下:粘贴并运行;)

    import javax.ejb.Remote;
    
    @Remote
    public interface HelloI {
    
        public String sayHello(String name);
    }
    
      import javax.ejb.Remote;
        import javax.ejb.Stateless;
        
        @Stateless(name = "HelloWorldEJB", mappedName="HelloEJB")
        @Remote(HelloI.class)
        public class Hello implements HelloI {
            @Override
            public String sayHello(String name) {
                return "Hello, " + name;
            }
        
        }
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.rmi.PortableRemoteObject;
    
    public class HelloT {
    
        public static void main(String[] args) {
    
            HelloI statelessHelloI = null;
            try {
                statelessHelloI = lookupStatelessHello(); // the method that throws exception
            } catch (NamingException e) {
                System.out.println("Bean Loading Failed");
                e.printStackTrace();
                Thread.currentThread().stop();
            }
            HelloI stub=(HelloI) PortableRemoteObject.narrow(statelessHelloI, HelloI.class);
            System.out.println("obtained a remote stateless hello for invocation");
            System.out.println(stub.sayHello(args[0]));
        }
    
    
    
        private static HelloI lookupStatelessHello() throws NamingException {
            // the problematic code:
            /*Properties jndiProperties = new Properties();
            jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
            jndiProperties.put(Context.PROVIDER_URL,"remote://localhost:4447"); // tried to change ports.
            jndiProperties.put("jboss.naming.client.ejb.context", true);
            Context context = new InitialContext(jndiProperties); // exception happens here*/
            Context context = new InitialContext();
            return (HelloI) context.lookup("HelloEJB");
        }
    }
    

    输出2020年7月18日下午5:58:07 获得远程无状态 你好,呼叫你好,阿尼

    进程已完成,退出代码为0

    我在上面的帖子中没有提到你的大部分代码

    import com.au.ejbs.HelloI;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    
    public class HelloT2 {
    
        public static void main(String[] args)throws Exception {
           Context context = new InitialContext();
        HelloI remote = (HelloI) context.lookup("HelloEJB");//resolves to mappedName @Stateless(name = "HelloWorldEJB", mappedName="HelloEJB"), from what I read could be glassfish and weblogic centric.
        System.out.println(remote.sayHello(args[0]));
        remote = (HelloI) context.lookup("java:global/ejb3_2_ear_exploded/ejb/HelloWorldEJB");//Portable should work on jboss and any container resolves to Stateless(name = "HelloWorldEJB"
        System.out.println(remote.sayHello(args[0]));
        }
    }
    
    推荐文章