【问题标题】:Changing an EJB from 2.1 to 3.0将 EJB 从 2.1 更改为 3.0
【发布时间】:2014-05-28 19:08:05
【问题描述】:

我有一个现有的 Web 应用程序 (Servlet),它远程访问当前写入 EJB 2.1 规范的 EJB(EJBHome、EJBObject、SessionBean,ejb-jar.xml 中的所有配置)。 servlet 通过 JNDI 查找访问 EJB,JNDI 名称在 weblogic-ejb-jar.xml 中指定。

我想将 EJB 更新到 EJB3.0,这将(希望)更容易添加到 API。

我的问题是我需要对现有的 servlet 代码进行最少的更改。换句话说,我仍然需要:

  1. 使用简单全局 JNDI 名称访问 EJB(它存储在数据库中,servlet 可以动态更改它查找的名称),并且
  2. 能够使用2.1风格:

    String jndiName = getJndiName();    // e.g. "BeanV2.0"
    BeanHome home = (BeanHome) PortableRemoteObject.narrow(
            jndiContext.lookup(jndiName), BeanHome.class);
    BeanRemote remote = home.create();
    remote.doBusiness();               // call business method
    

我尝试了一个精简版,应用@RemoteHome,但在部署过程中我不断收到错误。

我在 Weblogic 上部署(用于开发/生产),主要是 10.3.5 (11gR1),并且仅限于 EJB 3.0。我正在使用 Eclipse(带有 Oracle Weblogic Pack)进行开发。

谢谢。

【问题讨论】:

  • 通过此链接,更改很少,但取决于您的代码设计。 javaworld.com/article/2071804/java-web-development/…
  • @Avinash K.P:我已经看到了那个链接。这篇文章说,DeMichiel 在 2005 Java One 2005 的 EJB 3.0 演示文稿中展示了一个示例。不幸的是,我所有指向该演示文稿的链接都指向developers.sun.com - 转发到Oracle Java 主页:-(。在Oracle 站点中搜索这篇文章给了我博客条目,所有这些都指向旧的Sun 站点。任何线索这些天在哪里可以找到那篇文章?

标签: java jakarta-ee ejb weblogic ejb-3.0


【解决方案1】:

我建议您先了解 EJB2.1 和 EJB3.x 之间的架构差异(参考here)

由于在 EJB3.x 中删除了 Home 和 Deployment Descriptor,您将根据 bean 实现和客户端调用对代码进行一些主要/次要更改

请参阅此示例以从客户端访问 EJB3.x,在您的情况下为 Servlet

/**
 * Servlet implementation class SampleServlet
 */
public class SampleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public SampleServlet() {
    super();
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
            Context ctx=getInitialContext();
            String jndiName=getJndiName();  // eg. java:global/BeanProject/Bean!demo.BeanRemote
            BeanRemote beanRemote = (BeanRemote)ctx.lookup(jndiName);
            remote.doBusiness();

    } catch(Exception exception) {
        System.out.println(exception.getMessage());
    }
}

private static Context getInitialContext() throws Exception
{
    Properties properties=new Properties();
    properties.put("java.naming.factory.initial","org.jboss.naming.remote.client.InitialContextFactory");
    properties.put("java.naming.provider.url","remote://localhost:4447");

    return new InitialContext(properties);
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}

}

希望这会有所帮助!

【讨论】:

  • 谢谢,@Adheep。我(几乎)通读了整个 EJB 3.0(和 3.1)规范,并并排实现了 2.1 和 3.0 bean,所以我确实理解其中的区别。我知道访问 EJB 的 new (3.0) 方式;我正在尝试以不需要对客户端进行 any 更改的方式重写 EJB,至少不需要立即更改。 (我将来可能想慢慢更新客户端,但我无法在可用的时间范围内全部完成。)
  • @Menachem,是的,我能理解你的问题,但我相信你现在已经明白,如果不改变客户端,你就无法迁移到 EJB3.x。但是我有一个建议,你可以在 2.1 中实现一个通用的代理 ejb,它唯一的工作就是调用一个 3.x 的 ejb 并将响应返回给客户端
  • 实际上,@Adheep,3.0 Spec (Simplified) 确实提到了一种方法来做到这一点,建议使用@RemoteHome 来注释 Home 界面。但是,我找不到任何有效的好例子。 jboss 有一个包含示例的 EJB 3 教程,但我无法将它部署到 Weblogic 上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
相关资源
最近更新 更多