Wicket的对象序列化问题

时间:2013-02-27 22:00:56

标签: java wicket wicket-1.5 wicket-1.6

我试图将一个searchService传递给一个Form to Wicket来使用。 当我在没有问题的情况下运行它时,我没有遇到任何问题,但是为了在覆盖的onSubmit中使用它,我必须使它成为最终版本。

    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的新手,所以我想知道是否有正确的方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

是。这是预期的行为。

Wicket将序列化整个页面。实际上,整个页面流。

您看到的错误很棒,因为它可以帮助您使应用程序在复制的会话群集中工作。

要解决它,你有几个选择。在我的头顶:

  • 您可以在onSubmit表单中实例化SearchService,而不是将其作为属性传递。
  • 您可以使用某种依赖注入。 Wicket开箱即用,支持Guice和Spring。但是没有什么可以阻止你将注入器代理与其他依赖注入器一起使用。
  • 您可以将SearchService存储在Wicket应用程序而不是页面上。 wicket应用程序是每个群集节点不可序列化的单例,并且可以在线程中使用。

答案 1 :(得分:0)

您可以尝试对Serializable类实现SearchService并声明变量serialVersionUID

例如:

public class SearchService implements Serializable {
    private static final long serialVersionUID = -1769512858853931584L;
    //your code
}