代码之家  ›  专栏  ›  技术社区  ›  Hank Jesus M C

servlet从远程EJB3会话bean接收空对象

  •  0
  • Hank Jesus M C  · 技术社区  · 15 年前

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

    因此,我有一个Java EE 6应用程序,它具有实体、外观(实现持久层)和无状态会话bean(EJB3),具有远程接口(通过外观提供对实体的访问)。

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

    现在,我尝试从Web应用程序(部署在同一个GalasFISH,实体+来自JavaEE应用程序的接口定义作为单独的JAR导入)中执行此操作。我有一个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();
        }
      }
      ...
    }
    

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

    1 回复  |  直到 12 年前
        1
  •  0
  •   Hank Jesus M C    15 年前

    …哦,孩子,这有点尴尬…

    事实证明,我忽略了一个关于使用 Vector 作为包含 @xxToMany 与…的关系 FetchType.LAZY :

    元素[field somefield]在 实体类[类活动]使用 集合类型[类 JPA时的Java.UTI.vector 仅规范支持 java.util.collection、java.util.set和 java.util.list或java.util.map。 此类型受“热切”支持 加载;使用延迟加载 集合类型需要其他 配置和间接容器 扩展[类]的实现 Java.UTI.Vector)或设置 使用基本间接和 要成为ValueHolderInterface的类型。

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

    • 使用 FetchType.EAGER (这样我就可以和 矢量 )
    • 使用 List (规范上说…)