0

我正在尝试将 searchService 传递给 Wicket 以供使用。当我在 searchService 没有最终版本的情况下运行它时,我没有遇到任何问题,但我必须将其设为最终版本才能在覆盖的 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的新手,所以我想知道是否有正确的方法可以做到这一点?

4

2 回答 2

4

是的。这是预期的行为。

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

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

要解决它,您有多种选择。在我的头顶上:

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

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

例如:

public class SearchService implements Serializable {
    private static final long serialVersionUID = -1769512858853931584L;
    //your code
}
于 2020-04-12T16:16:13.963 回答