我正在寻找关于处理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。
答案 0 :(得分: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()
的结果,然后您不仅应该摆脱该错误,而且您的对象将需要更少的会话存储空间。
答案 1 :(得分:2)
如果你想坚持使用接近当前基本架构的东西,那么stevevis将你的列表转换为[LoadableDetachableModel][1]
的过程是合理的。
更大的改变也可以起作用,并且出于某些目的可能更好的方法是切换到使用DataView
,以便所显示的数据根据需要来自IDataProvider
的实现,而不是正如你在List
所做的一样。
可以在the wicket examples site找到这些和其他转发器的良好示例代码。