对象序列化与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应用程序是每个群集节点的不可序列化单例,它在线程中可用。
所以我想要做的是... SearchService包含帮助我查询数据库的函数。 我有一个常规的按钮,将onClick调用searchService.addProduct(); 然后提交按钮,将onClick调用searchService.getSearchResults(); 如果我做了第一个选项,我将无法在按钮函数中使用我的searchService变量。 什么是最好的方法?第二或第三? 我一直在阅读模型,并没有完全理解他们,但这也有助于这种情况吗? – dhongyt 2013-02-28 02:22:35
只需使用表单模型来存储您需要的内容并将它传递给这两个组件。模型只是一个过度炒作的指针。从你的评论我采取SearchService是可变的,呃?糟糕的设计。 – 2013-02-28 16:13:25