2010-04-20 46 views
0

我敢肯定,这是一个初学者的错误空对象......servlet接收来自远程EJB3会话Bean

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

这工作正常。通过SLSB,我可以检索和操作实体。我试图从一个Web应用程序(部署在同一个Glassfish中,实体+从独立jar导入的Java EE应用程序的接口定义)执行此操作。我有一个Servlet,它接收一个SLSB注入的实例。我得到它的检索实体,并执行以下操作(我可以看到它在日志中):

  • 远程SLSB被实例化,称为其方法
  • SLSB实例门面,调用“得到”方法
  • 门面从数据库中检索实体的情况下,返回它
  • 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(); 
    } 
    } 
    ... 
} 

请让我知道,如果你想看到其他的代码,我会更新帖子。

+0

是c空对象或getsomestring返回空? 日志在调用返回到servlet之前是否显示在SLSB中完全填充的“5L”广告系列? – JoseK 2010-04-21 13:08:04

+0

@josek:'c'存在,不为null。 'c.getSomeString()'返回null。当SLSB检索'5L'活动时,'someString'被正确填充。 – Hank 2010-04-21 14:04:01

+0

我可能是错的,但认为glassfish需要打包在同一个webapp中的远程接口。 – JoseK 2010-04-21 17:01:49

回答

0

...哦,孩子,这是有点尴尬......

原来,我一直忽略了有关使用Vector作为字段的类型,其保持@xxToMany关系不错的小警告与FetchType.LAZY

元素[字段someField]内 实体类[类活动]使用 集合类型[类 java.util.Vector中]当JPA 规范只支持 java.util.Collection,java.util.Set, java.util.List或java.util.Map。 这种类型支持渴望 加载;使用延迟加载与此 集合类型需要额外 配置和延伸[类 java.util.Vector中]或设置 映射为使用基本的间接和 类型为ValueholderInterface一个IndirectContainer 实现。

两个可能的解决方案可以解决我的问题:

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