jakarta-ee - 从不同的服务器远程访问 EJB

标签 jakarta-ee servlets ejb glassfish-3 ejb-3.1

我正在 Eclipse Juno 中开发一个包含 的项目。 EJB 3.1 动态网页项目 .

EJB 类被称为 第一 bean Servlet 被称为 EJB31ServletClient , 我已经实现了使它在 中工作同一台服务器 .我读过我需要设置 InitialContext.lookup 但几乎所有示例都是为 JavaSE 应用程序制作的。

我要达到的目标:

  • 在 Glassfish 3.1.2.2 服务器中部署 EJB Jar,并将动态 Web 项目部署在不同的 GlassFish 服务器中。
  • 在 EJB31ServletClient 中调用 sayHello() 方法。

  • 这是我的代码:

    EJB 是一个非常简单的无状态 session 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());
        }
    }
    

    最佳答案

    您需要使用远程接口(interface)创建 bean。您创建的 bean 是一个可以使用相同 JVM 访问的 Local 、 No-Interface bean。要对 bean 进行远程调用,您需要创建一个具有远程接口(interface)的 bean。见下面修改后的 bean 代码和接口(interface)。

    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 管理控制台,以便您可以找到它

    关于jakarta-ee - 从不同的服务器远程访问 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18219621/

    相关文章:

    java - 如何在 Java 中获取不同时区的当前时间?

    java - 使用 Eclipse Indigo 时获取 realpath 的问题

    java - 在 Sonatype Nexus 和 EclipseLink Maven Repo Proxy 方面需要帮助

    jakarta-ee - 为什么 Jakarta ee 网站上的 Jakarta EE 规范是空的?

    java - 如何使用 JBoss 在 Web 应用程序之间共享库

    java - 不允许非成员(member)显示jsp页面

    java - 使用 tomcat 和 servlet 捕获异常

    java - JBoss Wildfly 中使用 EJB 和 JAR 进行 EAR 部署 - 如何从 EJB 项目中加载文件夹中的所有文件或 JAR 中的资源?

    java - EJB 3 预加载

    两个耦合类中的 Java EE EJB 注入(inject)