我有EJB bean
接口:
package com.xlab.ice.ejb.sessionbean;
import javax.ejb.Remote;
@Remote
public interface Session {
public String getMessage();
}
豆:
package com.xlab.ice.ejb.sessionbean;
import javax.ejb.Stateless;
@Stateless
public class SessionBean implements Session {
public SessionBean() {
}
public String getMessage() {
return "Hello!";
}
}
它已成功部署到Glassfhish 4中。 但我无法通过简单的客户端访问它:
package com.xlab.ice.ejb.sessionbean;
import javax.ejb.EJB;
public class Client {
@EJB
private static SessionBean sessionBean;
public void getMsg() {
System.out.print(sessionBean.getMessage());
}
public static void main(String[] args) {
new Client().getMsg();
}
}
当我试图通过以下方式运行它:appclient -client SessionBeanClient.jar我收到错误。 这是堆栈跟踪 - http://pastebin.com/JuHRcQp5
我做错了什么?
答案 0 :(得分:1)
您正尝试通过独立客户端访问ejb。
这需要特定的jndi手动查找,如果你从ejb开始,那么在获得ejb的旅馆之前,这将是最好的起点。
那说:
您需要知道部署ejb的主机和CORBA端口。
创建一个初始上下文并进行手动查找。
请参阅此stackoverflow问题,了解如何进行此操作。
答案 1 :(得分:0)
您是否在同一台服务器上部署客户端和bean?您不必使用接口,可以使用'@LocalBean'来注释bean,因此可以从同一个JVM中调用它。 对于你的问题:你需要按如下方式注入bean:
public class Client {
@EJB
private static SessionBean sessionBean;
private final String jndiName = "java:global/find/this/out";
public void getMsg() {
InitialContext ctx = new InitialContext();
sessionBean = (SessionBean) ctx.lookup(ejb_path);
System.out.print(sessionBean.getMessage());
}
public static void main(String[] args) {
new Client().getMsg();
}
}
这仅适用于本地bean,对于必须配置访问权限的远程bean,请查看here。 在部署bean之后,您可以在glassfish服务器的日志文件中找到JNDI名称。
答案 2 :(得分:0)
你应该看看maress在答案中所说的内容。此外,您不能将EJB
注入静态字段,请参阅this question以获取EJB规范的链接和引用以及不允许的原因。
答案 3 :(得分:0)
private static SessionBean sessionBean;
应改为
private static Session sessionBean;