Servlet从远程EJB3会话Bean接收空对象

时间:2010-04-20 14:12:07

标签: servlets ejb-3.0 java-ee-6 stateless-session-bean

我确定这是初学者错误......

所以我有一个Java EE 6应用程序,包含实体,外观(实现持久层)和带有远程接口的无状态会话Bean(EJB3)(通过外墙提供对实体的访问)。

这很好用。通过SLSB,我可以检索和操纵实体。

现在,我正在尝试从Web应用程序(部署在相同的Glassfish上,从作为单独jar导入的Java EE应用程序的实体+接口定义)部署。我有一个Servlet,它接收注入的SLSB实例。我得到它来检索一个实体,并发生以下情况(我可以在日志中看到它):

  • 远程SLSB被实例化,其方法称为
  • SLSB实例化外观,调用'get'方法
  • facade从DB中检索实体实例,将其返回
  • SLSB将实体的实例返回给调用者
    • (一切都很好,直到这里)
  • 调用servlet接收..实体的空实例 !!

出了什么问题?这应该有用,对吧?

MyServlet:

public class MyServlet extends HttpServlet {

  @EJB
  private CampaignControllerRemote campaignController; // remote SLSB

  protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/plain");
    PrintWriter out = response.getWriter();
    try {
      Campaign c = campaignController.getCampaign(5L); // id of an existing campaign
      out.println("Got "+ c.getSomeString()); // is null !!
    } finally { 
        out.close();
    }
  }
  ...
}

如果您想查看其他代码,请告诉我,我会更新帖子。

1 个答案:

答案 0 :(得分:0)

......哦,小伙子,这有点令人尴尬......

事实证明,我一直忽略了一个关于使用Vector作为与@xxToMany保持FetchType.LAZY关系的字段类型的一个小小警告:

  

元素[field someField]内   实体类[类Campaign]使用   集合类型[类   java.util.Vector]当JPA   规范只支持   java.util.Collection,java.util.Set,   java.util.List或java.util.Map。   渴望支持这种类型   装载;使用延迟加载   集合类型需要额外的   配置和IndirectContainer   扩展的实现[class   java.util.Vector]或设置   映射使用基本间接和   类型为ValueholderInterface。

两种可能的解决方案可以解决我的行为:

  • 使用FetchType.EAGER(然后我可以留在Vector
  • 使用List(如规范所说......)