Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EJB3.2-Can';无法正确配置远程客户端_Java_Jakarta Ee_Ejb_Jboss7.x_Initial Context - Fatal编程技术网

Java EJB3.2-Can';无法正确配置远程客户端

Java EJB3.2-Can';无法正确配置远程客户端,java,jakarta-ee,ejb,jboss7.x,initial-context,Java,Jakarta Ee,Ejb,Jboss7.x,Initial Context,我是EJB新手,为了演示,我编写了一个非常小的EJB组件。它要做的就是打印“你好”。当前正在努力正确配置远程客户端的InitialContext。我使用的容器是JBoss7.0。我将JAVEE7.0与ejb3.2一起使用 ejb的接口: package hello; public interface Hello { public String sayHello(String name); } bean本身: package hello; import javax.ejb.Remo

我是EJB新手,为了演示,我编写了一个非常小的EJB组件。它要做的就是打印“你好”。当前正在努力正确配置远程客户端的InitialContext。我使用的容器是JBoss7.0。我将JAVEE7.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:20141信息[org.jboss.as.ejb3.deployment.processors.ejbjndibbindingsdeploymentunitprocessor] (MSC服务线程1-6)名为HelloEJB的会话bean的JNDI绑定 部署单元部署中的“无状态1.jar”如下所示:

java:global/stateless1/HelloEJB!你好,你好 java:app/stateless1/HelloEJB!你好,你好 java:module/HelloEJB!你好,你好
java:global/stateless1/HelloEJB java:app/stateless1/HelloEJB
java:module/HelloEJB

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

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

加载Bean失败javax.naming.NoInitialContextException:无法实例化类: org.jboss.naming.remote.client.InitialContextFactory[根异常 is 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.lookupStatelessHello(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的方式是错误的,但这不是现在的问题


我希望你能帮我找到我做错的地方。如果您需要有关设置的更多信息,请询问。

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


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

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


查看$JBOSS_HOME/bin/client/README-EJB-JMS.txt文件,了解您需要在客户机中包含哪些jar的信息。

如上所述,您需要将JBOSS-client.jar与您的代码一起提供,以便工作。具体的jar可以在

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

另外,请查看随附完整示例的官方文档和wiki。请参阅。

如上所述,您需要将所需的jboss-client.jar与您的代码一起提供,以使其正常工作。具体的jar可以在

JBOSS_HOME/bin/client/jboss-client-7.1.0.Final.jar.
另外,请查看随附完整示例的官方文档和wiki。看

  • 在我的例子中,确保
    client*.jar
    在类路径中,因为使用glassfish而不是JBoss
  • 客户端代码更改阅读注释2种查找方法
  • ejb无状态(name=“HelloWorldEJB”,mappedName=“HelloEJB”)应仅与name一起使用,因为其可移植性和mappedName是供应商锁定的,不鼓励使用。我仅将其用于说明目的
  • 此外,我还没有在同一容器中设置jndi道具
  • Context Context=new InitialContext()

  • 代码更改后重新部署或重新启动JBoss
  • 工作代码在下面(粘贴并运行;)

    输出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]));
        }
    }
    
  • 在我的例子中,确保
    client*.jar
    在类路径中,因为使用glassfish而不是JBoss
  • 客户端代码更改阅读注释2种查找方法
  • ejb无状态(name=“HelloWorldEJB”,mappedName=“HelloEJB”)应仅与name一起使用,因为其可移植性和mappedName是供应商锁定的,不鼓励使用。我仅将其用于说明目的
  • 此外,我还没有在同一容器中设置jndi道具
  • Context Context=new InitialContext()

  • 代码更改后重新部署或重新启动JBoss
  • 工作代码在下面(粘贴并运行;)

    输出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]));
        }
    }