2010-04-20 82 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(作爲規範說...)