对象序列化与Wicket问题

问题描述:

我想通过一个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 

我是新来的检票口,所以我不知道是否有做这种正确的方法是什么?

是的。这是预期的行为。

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