1

セッションサイズに壊滅的な影響を与えない、Wicket内のオブジェクトのコレクションを処理するための最良の方法に関する支援またはガイダンスを探しています。明らかに、WicketのIModelクラスのいずれかでオブジェクトをラップするのが理想的ですが、オブジェクトのコレクション(検索結果のコレクションなど)を操作するときにそれを行うための最良の方法は何ですか。

個々のオブジェクトを操作するときにLoadableDetachableModelを使用して成功しましたが、Tomcatをシャットダウンするとjava.io.NotSerializableExceptionが断続的に発生するようです。当初、私は安全だと思っていましたが、スローされた例外はそうではないことを示唆しています。

これはコードです(簡潔にするために編集されています):

public class CandidateSearch extends BasicPage {

private static final long serialVersionUID = 1L;
private CandidateService service = new CandidateService();

public CandidateSearch() {
    ListView<Candidate> listView = new ListView<Candidate>("candidates", service.search()){

        private static final long serialVersionUID = 1L;

        @Override
        protected void populateItem(ListItem<Candidate> item) {
            Candidate candidate = (Candidate) item.getModelObject();

            PageParameters pars = new PageParameters();
            pars.add("id", candidate.getId());
            Link<String> candidateLink = new BookmarkablePageLink<String>("candidateLink", CandidateDetails.class, pars);

            candidateLink.add(new Label("candidateId", "ID-" + new Long(candidate.getId()).toString()));

            item.add(candidateLink);
            item.add(new Label("name", candidate.getFirstName() + " " + candidate.getLastName()));
            item.add(new Label("location", candidate.getCity() + ", " + candidate.getState()));
        }

    };

    add(listView);

}

}

注:service.searchは、Candidateとして入力されたjava.util.Listを返します。

4

2 に答える 2

2

そのように を構築するListViewと、Candidateオブジェクトは取り外しできなくなります...そのため、java.io.NotSerializableException.

これがベスト プラクティスかどうかはわかりませんが、私の戦略は、オブジェクトのリストをリストの に変換することLoadableDetachableModelです。次のようなユーティリティメソッドがあります。

public static <T> IModel<? extends List<T>> convertToListViewModel(List<T> objects) {

    final Class<? extends List> listClass = objects.getClass();

    // NOTE: you will need to implement the toLoadableDetachableModels method
    List<IModel<T>> asModels = toLoadableDetachableModels(objects);

    return new LoadableDetachableModel<List<T>>() {
        @Override
        protected List<T> load() {
            List<T> results = ClassUtils.newInstance(listClass);
            for(IModel<T> model : asModels) {
                results.add(model.getObject());
            }
            return results;
        }
    };
}

このメソッドを使用して の結果をラップするservice.search()と、そのエラーを取り除くだけでなく、オブジェクトが必要とするセッション ストレージ スペースがはるかに少なくなります。

于 2013-01-05T00:18:31.057 に答える
2

リストを に変換する stevevis によって提案されたプロセスは[LoadableDetachableModel][1]、現在の基本アーキテクチャに近いものに固執したい場合に合理的です。

同様に機能し、いくつかの目的のためにおそらくより良い変更は、を使用するように切り替えるDataViewことIDataProviderですList.

これらおよびその他のリピーターの良いサンプル コードは、ウィケットのサンプル サイトにあります。

于 2013-01-05T17:06:07.877 に答える