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

Servlets Servlet从远程EJB3会话Bean接收空对象,servlets,ejb-3.0,java-ee-6,stateless-session-bean,Servlets,Ejb 3.0,Java Ee 6,Stateless Session Bean,我相信这是一个初学者的错误 因此,我有一个JavaEE6应用程序,其中包含实体、实现持久化层的facades和无状态会话Beans EJB3,其中包含远程接口,通过facades提供对实体的访问 这很好用。通过SLSB,我可以检索和操作实体 现在,我正试图从部署在同一Glassfish上的Web应用程序中实现这一点,该Glassfish是作为单独的jar导入的JavaEE应用程序的实体+接口定义。我有一个Servlet,它接收SLSB的一个实例。我让它检索一个实体,我可以在日志中看到以下情况:

我相信这是一个初学者的错误

因此,我有一个JavaEE6应用程序,其中包含实体、实现持久化层的facades和无状态会话Beans EJB3,其中包含远程接口,通过facades提供对实体的访问

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

现在,我正试图从部署在同一Glassfish上的Web应用程序中实现这一点,该Glassfish是作为单独的jar导入的JavaEE应用程序的实体+接口定义。我有一个Servlet,它接收SLSB的一个实例。我让它检索一个实体,我可以在日志中看到以下情况:

远程SLSB被实例化,其方法被调用 SLSB实例化facade,调用“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();
    }
  }
  ...
}

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

。。。哦,天哪,这有点尴尬

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

内的元素[字段someField] 实体类[class Campaign]使用 集合类型[类别] 当JPA 规范仅支持 java.util.Collection,java.util.Set, java.util.List或java.util.Map。 此类型受eager支持 加载;使用延迟加载 集合类型需要额外的 配置和间接容器 扩展[class]的实现 或设置 映射以使用基本间接寻址和 要设置为ValueholderInterface的类型

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

使用FetchType.EAGER,这样我就可以继续使用Vector了 按规范所述使用列表。。。
c对象为null还是getsomestring返回为空?日志是否显示在调用返回servlet之前在SLSB中完全填充了“5L”活动?@josek:c存在,不为null。c、 getSomeString返回null。当SLSB检索“5L”活动时,someString被正确填充。我可能错了,但我认为glassfish需要在同一个webapp中打包远程接口。