2013-01-04 51 views
1

我正在寻找一些关于处理Wicket中对象集合的最佳方式的帮助或指导,这些对象不会对会话大小产生破坏性影响。显然,用Wicket的IModel类包装对象是理想的,但在处理对象集合(例如搜索结果集合)时,最好的方法是什么。在Wicket中处理模型对象集合的正确方法是什么?

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

回答

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

+0

+1:一种可重复使用的策略,我也有时使用。 –

+0

这是非常好的,非常有帮助。非常感谢你们俩。 – mchandler

2

如果您想要坚持一些与您当前的基本架构接近的东西,那么stevevis建议将您的列表转换为[LoadableDetachableModel][1]的过程是合理的。根据需要和您在做不保持

,将工作以及和出于某些目的也许更好较大的变化将切换到使用DataView,使显示的数据来源于IDataProvider实现List

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

相关问题