【问题标题】:Creating a EJB3.1 + Portlet Project创建 EJB3.1 + Portlet 项目
【发布时间】:2014-04-29 12:31:06
【问题描述】:

我只想创建一个 Portlet 并在此 Portlet 中使用 EJB。

我正在使用 JBoss 7.1 和 Liferay 6.2。

我创建了一个 EJB 项目和一个 liferay 插件项目。

我只想从 EJB 调用一个方法,如下所示:

@Local
public class PortletController {

 public PortletController() {
 }

 public String getUserName() {
  return "foobar";      
 }
}

我的 portlet 尝试获取用户名,如下所示:

public class ABPortlet extends MVCPortlet {

private String userName;

@EJB
PortletController controller;


public ABPortlet() {}

public void doView(RenderRequest rr, RenderResponse rp) throws IOException, PortletException {

    userName = controller.getUserName();
    if(userName==null) {
        userName = "nope";
    }
    rr.setAttribute("userName", userName);
    super.doView(rr, rp);
}
}

我是不是已经做错了什么?我在一个教程中读到,如果 bean 在与 portlet 相同的 JRE 中运行,我可以在不查找的情况下访问本地 bean。

如何正确部署这两个项目?我将 EJB 项目导出为 jar 并将其作为依赖项添加到 portlet 项目中,但我刚刚在 doView 方法中得到了 NullpointerException,在这一行:

        userName = controller.getUserName();

【问题讨论】:

    标签: java ejb cdi portlet


    【解决方案1】:

    我在一篇教程中读到,如果 bean 在与 portlet 相同的 JRE 中运行,我无需查找即可访问本地 bean。

    当您提到 JRE 时,您的意思是在同一个 JVM 中,是的,您不必担心 JNDI查找您的 portlet 和 ejb 模块是否在同一 JVM 实例中本地运行。

    关于您打包应用程序的方式,我建议不要这样做(ejb 和 portlet 在同一个 jar 中),因为从最佳实践中可以看出,您最好将 业务模块( ejb) 来自您查看模块 (portlet)。 所以你可能需要单独打包每一个,portlet 进入一个战争档案,你的 ejb 进入它自己的 jar/module one。

    现在回到您的代码,您需要查看以下企业存档编码约定:

    使用 POJI 声明你的本地 bean 骨架:

    @Local
    public interface PortletControllerLocal 
    {
      public String getUserName();
    }
    

    实现您的 Stateless/Stateful 会话 bean 并指定其 name 注释属性:

    @Statefull
    @EJB(name = "portletControllerBean")
    public class PortletControllerBean implements PortletConrollerLocal
    {
      public String getUsername()
      {
        //Do you stuff
      }
    }
    

    使用beanName 属性在您的portlet 控制器类下注入您的bean:

    public class ABPortlet extends MVCPortlet 
    {
      private String userName;
      @EJB(beanName = "portletControllerBean")
      PortletControllerBean controller;
    
      public ABPortlet() {}
    
      public void doView(RenderRequest rr, RenderResponse rp) throws IOException,PortletException 
      {
        userName = controller.getUserName();
        if(userName==null) {
          userName = "nope";
        }
        rr.setAttribute("userName", userName);
        super.doView(rr, rp);
      }
    }
    

    【讨论】:

    • 非常感谢您的回答,它对我帮助很大。最后一个问题:当你说 ejb's 转到“ejb/modules”时,你的意思是我的 jboss 主目录中的文件夹 /modules?
    • 根据本手册,我必须将 EJB 部署为 EAR 文件,将 ejb-jar.xml 编辑为我不知道是什么,然后我可以使用 EJB 而无需将它们绑定到 java 构建路径我的 portlet 的?:link
    • 据我所知,ejb-jar.xml 从 EJB 3.0 开始是可选的。而是使用注释来声明 EJB 元数据。正如您发布的链接中所述,您必须将模块打包在 JAR 中(正如我建议在不同层之间松散耦合)或在您的 war 文件中(它应该是您的 portlet,它位于 WEB -INF/classes),在这里您将拥有严格绑定到您的 Web 应用程序的 EJB。
    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多