Java EJB3.2-Can';无法正确配置远程客户端
我是EJB新手,为了演示,我编写了一个非常小的EJB组件。它要做的就是打印“你好”。当前正在努力正确配置远程客户端的InitialContext。我使用的容器是JBoss7.0。我将JAVEE7.0与ejb3.2一起使用 ejb的接口: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
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而不是JBossContext 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]));
}
}