Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建EJB3.1+Portlet项目_Java_Ejb_Cdi_Portlet - Fatal编程技术网

Java 创建EJB3.1+Portlet项目

Java 创建EJB3.1+Portlet项目,java,ejb,cdi,portlet,Java,Ejb,Cdi,Portlet,我只想创建一个Portlet并在此Portlet中使用EJB Iam使用JBoss 7.1和Liferay 6.2 我创建了一个EJB项目和一个liferay插件项目 我只想从EJB调用一个方法,如下所示: @Local public class PortletController { public PortletController() { } public String getUserName() { return "foobar"; } } public cl

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

Iam使用JBoss 7.1和Liferay 6.2

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

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

@Local
public class PortletController {

 public PortletController() {
 }

 public String getUserName() {
  return "foobar";      
 }
}
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);
}
}
My portlet尝试获取用户名,如下所示:

@Local
public class PortletController {

 public PortletController() {
 }

 public String getUserName() {
  return "foobar";      
 }
}
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();
我在一篇教程中读到,如果bean像portlet一样运行在同一个JRE中,那么我可以访问本地bean而无需查找

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

关于打包应用程序的方式,我建议不要在同一个jar中打包ejb和portlet,因为从最佳实践中可以看出,最好将业务模块ejb与视图模块portlet分开。 因此,您可能需要分别对每个组件进行打包,portlet进入war归档,ejb进入自己的jar/模块

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

使用POJI声明本地bean骨架:

@Local
public interface PortletControllerLocal 
{
  public String getUserName();
}
实现无状态/有状态会话bean并指定其名称注释属性:

@Statefull
@EJB(name = "portletControllerBean")
public class PortletControllerBean implements PortletConrollerLocal
{
  public String getUsername()
  {
    //Do you stuff
  }
}
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);
  }
}
使用beanName属性在portlet控制器类下注入bean:

@Statefull
@EJB(name = "portletControllerBean")
public class PortletControllerBean implements PortletConrollerLocal
{
  public String getUsername()
  {
    //Do you stuff
  }
}
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转到ejb/modules时,你是指我的jboss主目录中的文件夹/模块吗?根据本手册,我必须将ejb部署为EAR文件,编辑ejb-jar.xml,使其成为我不知道的内容,然后我可以使用ejb,而无需将它们绑定到我的portlet的java构建路径中,从EJB3.0开始,ejb-jar.xml是可选的。注释被用来声明EJB元数据。正如在您发布的链接中所提到的,您要么像我建议的那样将模块打包到JAR中,以实现不同层之间的松耦合,要么在war文件中,它应该是您的portlet,它位于WEB-INF/类之下,在这里,您的EJB将严格绑定到您的WEB应用程序。