我是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的方式是错误的,但现在不是问题所在。
我希望你能帮我找到我在这里做错的事情。如果您需要更多关于设置的信息,只需询问。