创建EJB3.1 + Portlet项目

时间:2014-04-29 12:31:06

标签: java ejb cdi portlet

我只想创建一个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方法中得到了一个N​​ullpointerException,在这一行:

        userName = controller.getUserName();

1 个答案:

答案 0 :(得分:0)

  

我在一个教程中读到,如果bean在与portlet相同的JRE中运行,我可以在不查找的情况下访问本地bean。

当你提到 JRE 时,你的意思是在同一个 JVM 中,是的,那是对的,你不必为 JNDI 而烦恼查找您的portlet和ejb模块是否在同一JVM实例中本地运行。

关于打包应用程序的方式,我建议不要这样做(ejb和portlet在同一个jar中),因为从最佳实践中可以看出,您最好将业务模块分开( ejb)来自你的视图模块(portlet)。 因此,您可能需要单独打包每个,portlet转到war存档,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);
  }
}