我正在Eclipse Juno中开发一个包含 EJB 3.1 和动态Web项目的项目。
EJB类称为 FirstBean ,Servlet称为 EJB31ServletClient ,我只能使其在相同的服务器中工作。我已经读过我需要设置InitialContext.lookup,但几乎所有示例都是针对JavaSE应用程序的。
我想要实现的目标:
在Glassfish 3.1.2.2服务器中部署EJB Jar,并在不同的GlassFish服务器中部署动态Web项目。
在EJB31ServletClient中调用sayHello()方法。
这是我的代码:
EJB是一个非常简单的无状态会话Bean ,带有无界面视图,只显示一条消息:
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
@Stateless
@LocalBean
public class FirstBean {
public FirstBean() {
}
public String sayHello() {
return "Hello";
}
}
Dynamic Web Project只有一个Servlet,代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.theopentutorials.businesslogic.FirstBean;
@WebServlet("/EJB31ServletClient")
public class EJB31ServletClient extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
FirstBean bean;
public EJB31ServletClient() {
super();
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(bean.sayHello());
}
}
答案 0 :(得分:4)
您需要使用远程接口创建bean。您创建的bean是一个Local,No-Interface bean,可以使用相同的JVM访问它。要对bean进行远程调用,您需要创建一个具有远程接口的bean。请参阅下面的修改后的bean代码和接口。
public class FirstBeanRemote{
public String sayHello() ;
}
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
@Stateless
@LocalBean
@Remote(FirstBeanRemote.class)
public class FirstBean {
public FirstBean() {
}
public String sayHello() {
return "Hello";
}
}
您需要使用JNDI查找从其他服务器查找EJB。
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("org.omg.CORBA.ORBInitialHost", "*hostname*");
props.setProperty("org.omg.CORBA.ORBInitialPort", "*3700*");//default port
InitialContext ctx = new InitialContext(props);
FirstBeanRemote bean = (FirstBeanRemote) ctx.lookup("java:global/*EARNAME/EJBJARNAME*/FirstBean!*fullyqualifiedpackage*.FirstBeanRemote");
试试这个并检查它是否有效。如果你找不到远程bean的JNDI名称,只需抓取你的glassfish管理控制台就可以找到它