2013-02-27 71 views
0

我想通過一個searchService到一個窗體Wicket使用。 當我運行這個與searchService是最終的,我沒有得到任何問題,但我必須做出最後的決定,以便在覆蓋的onSubmit中使用它。對象序列化與Wicket問題

final SearchService searchService = new SearchService(); 

    Form<?> form = new Form("searchForm") { 
     public void onSubmit() { 
      List<File> results = searchService.getSearchResults(); 
      info("Found: " + results.size()); 
     } 
    }; 

如果我這樣做,我收到一個錯誤:

org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException: The object type is not Serializable! 
A problem occurred while checking object with type: test.service.SearchService 
Field hierarchy is: 
    2 [class=test.webui.HomePage, path=2] 
    private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;] 
     private java.lang.Object org.apache.wicket.MarkupContainer.children[1] [class=org.apache.wicket.markup.html.form.Form, path=2:searchForm] 
     private final test.service.SearchService test.webui.HomePage$1.val$searchService [class=test.service.SearchService] <----- field that is causing the problem 

我是新來的檢票口,所以我不知道是否有做這種正確的方法是什麼?

回答

4

是的。這是預期的行爲。

Wicket將序列化整個頁面。實際上,整個頁面流。

您所看到的錯誤是偉大的,因爲它可以幫助你讓你的應用程序工作複製會話集羣。

要解決它,你有幾個選項。關閉我的頭頂:

  • 您可以在onSubmit表單中實例化SearchService,而不是將其作爲屬性傳遞。
  • 你可以使用某種依賴注入。 Wicket支持Guice和Spring。但是沒有什麼能阻止你使用注入代理和其他依賴注入器。
  • 您可以將SearchService存儲在Wicket應用程序而不是頁面上。 wicket應用程序是每個羣集節點的不可序列化單例,它在線程中可用。
+0

所以我想要做的是... SearchService包含幫助我查詢數據庫的函數。 我有一個常規的按鈕,將onClick調用searchService.addProduct(); 然後提交按鈕,將onClick調用searchService.getSearchResults(); 如果我做了第一個選項,我將無法在按鈕函數中使用我的searchService變量。 什麼是最好的方法?第二或第三? 我一直在閱讀模型,並沒有完全理解他們,但這也有助於這種情況嗎? – dhongyt 2013-02-28 02:22:35

+0

只需使用表單模型來存儲您需要的內容並將它傳遞給這兩個組件。模型只是一個過度炒作的指針。從你的評論我採取SearchService是可變的,呃?糟糕的設計。 – 2013-02-28 16:13:25