0

searchService を Form に渡して Wicket に渡して使用しようとしています。searchService を final にせずにこれを実行すると、問題は発生しませんが、上書きされた onSubmit 内で使用するには、final にする必要があります。

    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

2 に答える 2

4

はい。これは予期される動作です。

Wicket はページ全体をシリアライズします。実際、ページフロー全体。

表示されているエラーは、レプリケートされたセッション クラスターでアプリケーションを動作させるのに役立つため、非常に役立ちます。

それを解決するには、いくつかのオプションがあります。私の頭の上から:

  • 属性として渡す代わりに、onSubmit フォーム内で SearchService をインスタンス化できます。
  • ある種の依存性注入を使用できます。Wicket は Guice と Spring をすぐにサポートします。しかし、インジェクター プロキシを他の依存関係インジェクターと共に使用することを妨げるものは何もありません。
  • ページの代わりに Wicket アプリケーションに SearchService を格納できます。ウィケット アプリケーションは、クラスター ノードごとのシリアル化できないシングルトンであり、スレッドで使用できます。
于 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 に答える