什么是处理模型对象的集合在检票正确的方法是什么?(What is the correct way t

2019-10-17 13:55发布

我要寻找到在处理该检票不会对会话大小产生了破坏性影响对象的集合的最好办法一些帮助或指导。 显然,包装物体与任何Wicket的IModel类是理想的,但什么是做的最好的方式与对象的集合工作(例如,搜索结果的集合)时。

我曾与一个单个对象工作时使用LoadableDetachableModel取得了成功,但我似乎间歇性地得到一个java.io.NotSerializableException关闭Tomcat的时候。 起初,我以为自己是安全的,但被抛出的异常表明并非如此。

这是(编辑为简洁起见)的代码:

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类型为候选人。

Answer 1:

当你构建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()然后不仅要你应该摆脱错误的,但你的对象需要少得多的会话存储空间。



Answer 2:

通过列表转换成的stevevis建议的过程[LoadableDetachableModel][1]是合理的,如果你想坚持的东西接近目前的基本架构。

一,将工作以及和出于某些目的也许更好更大的变化将切换到使用一个DataView ,以便显示的数据来自的实现IDataProvider根据需要和您在做不保持List的。

对于这些和其他中继很好的例子代码可以被发现在检票口的例子网站 。



文章来源: What is the correct way to handle collections of model objects in Wicket?
标签: java wicket