6

我正在 Eclipse Juno 中开发一个包含EJB 3.1Dynamic Web Project的项目。

EJB 类称为FirstBean,Servlet 称为EJB31ServletClient,我实现的只是使其在同一台服务器上工作。我读过我需要设置 InitialContext.lookup 但几乎所有示例都是为 JavaSE 应用程序制作的。

我想要达到的目标:

  1. 在 Glassfish 3.1.2.2 服务器中部署 EJB Jar,并将动态 Web 项目部署在不同的 GlassFish 服务器中。

  2. 在 EJB31ServletClient 中调用 sayHello() 方法。

这是我的代码:

EJB 是一个非常简单的无状态会话 Bean ,它具有仅显示一条消息的无接口视图

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@Stateless
@LocalBean
public class FirstBean {
    public FirstBean() {
    }

    public String sayHello() {
        return "Hello";
    }
}

动态 Web 项目只有一个 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());
    }
}
4

1 回答 1

5

您需要使用远程接口创建 bean。您创建的 bean 是一个可以使用相同 JVM 访问的 Local 、 No-Interface bean。要对 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 管理控制台,以便您可以找到它

于 2013-08-14T05:31:08.017 回答