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 返回一个 java.util.List 类型为 Candidate。

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

[LoadableDetachableModel][1]如果您想坚持使用接近当前基本架构的东西,stevevis 建议的将列表转换为 a 的过程是合理的。

一个更大的改变也可以工作并且对于某些目的可能更好的是切换到使用 a DataView,以便显示的数据来自根据IDataProvider需要的实现,而不是像你在 a 中所做的那样List

这些和其他中继器的良好示例代码可以在wicket 示例站点找到。

于 2013-01-05T17:06:07.877 回答