Wicket NotSerializableException填充ListView

Wicket NotSerializableException填充ListView,wicket,wicket-6,Wicket,Wicket 6,我正在开发一个使用Spring和Hibernate框架的Web应用程序。现在,我想从我的Viaggio.java类(一个JPA实体)中删除可序列化接口实现。 此类的实体通过PageableListView显示在我的Wicket页面中。 当我呈现网页时,我得到一个NotSerializableException。 下面是实例化ListView的代码片段: final LoadableDetachableModel<List<Viaggio>> viaggiL

我正在开发一个使用Spring和Hibernate框架的Web应用程序。现在,我想从我的Viaggio.java类(一个JPA实体)中删除可序列化接口实现。 此类的实体通过PageableListView显示在我的Wicket页面中。 当我呈现网页时,我得到一个NotSerializableException。 下面是实例化ListView的代码片段:

        final LoadableDetachableModel<List<Viaggio>> viaggiListModel = new LoadableDetachableModel<List<Viaggio>>() {
        @Override
        protected List<Viaggio> load() {
            List<Viaggio> viaggi = utenteService.findAllViaggiForDataAndUsername(dataSelected, utente);
            return viaggi;
        }
    };

    final WebMarkupContainer container = new WebMarkupContainer("tableResult");
    container.setOutputMarkupId(true);
    PageableListView repeating = new PageableListView("repeating", viaggiListModel, 10) {
        @Override
        protected void populateItem(ListItem item) {
            final Viaggio viaggio = (Viaggio) item.getModelObject();
            String date = new SimpleDateFormat("dd-MM-yyyy").format(viaggio.getData());
            item.add(new Label("data", date));
            item.add(new Label("automezzo", new PropertyModel(viaggio, "targaMotrice")));
            item.add(new Label("autista", new PropertyModel(viaggio, "primoAutista")));
            item.add(new EnumLabel("status", new PropertyModel(viaggio, "status")));
......
final LoadableDetachableModel viaggilitmodel=new LoadableDetachableModel(){
@凌驾
受保护列表加载(){
列表viaggi=uteService.findAllViaggiForDataAndUsername(dataSelected,ute);
返回维亚吉;
}
};
最终WebMarkupContainer容器=新的WebMarkupContainer(“tableResult”);
container.setOutputMarkupId(true);
PageableListView repeating=新的PageableListView(“repeating”,viaggiListModel,10){
@凌驾
受保护的void populateItem(列表项){
final Viaggio Viaggio=(Viaggio)item.getModelObject();
字符串日期=新的SimpleDataFormat(“dd-MM-yyyy”).format(viaggio.getData());
添加(新标签(“数据”,日期));
添加(新标签(“automezzo”,新PropertyModel(viaggio,targaMotrice”));
添加(新标签(“autista”,新PropertyModel(viaggio,“Primoutistta”));
添加(新EnumLabel(“状态”),新PropertyModel(viaggio,“状态”));
......
我将stacktrace打印在这里:

    24/02/2018 09:06:22,629 ERROR -JavaSerializer - Error serializing object class it.loginet.buonicarico.presentation.ViaggioListPage [object=[Page class = it.loginet.buonicarico.presentation.ViaggioListPage, id = 2, render count = 1]]
    org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException: The object type is not Serializable!
A problem occurred while checking object with type: it.loginet.buonicarico.domain.utente.Viaggio
Field hierarchy is:
  2 [class=it.loginet.buonicarico.presentation.ViaggioListPage, path=2]
    private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;]
      private java.lang.Object org.apache.wicket.MarkupContainer.children[5] [class=org.apache.wicket.markup.html.WebMarkupContainer, path=2:tableResult]
        private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;]
          private java.lang.Object org.apache.wicket.MarkupContainer.children[0] [class=org.apache.wicket.markup.html.navigation.paging.PagingNavigator, path=2:tableResult:navigator]
            private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;]
              private java.lang.Object org.apache.wicket.MarkupContainer.children[0] [class=org.apache.wicket.markup.html.navigation.paging.PagingNavigation, path=2:tableResult:navigator:navigation]
                private java.lang.Object org.apache.wicket.MarkupContainer.children [class=org.apache.wicket.markup.html.list.LoopItem, path=2:tableResult:navigator:navigation:0]
                  private java.lang.Object org.apache.wicket.MarkupContainer.children [class=org.apache.wicket.markup.html.navigation.paging.PagingNavigationLink, path=2:tableResult:navigator:navigation:0:pageLink]
                    protected final org.apache.wicket.markup.html.navigation.paging.IPageable org.apache.wicket.markup.html.navigation.paging.PagingNavigationLink.pageable [class=org.apache.wicket.markup.html.list.PageableListView, path=2:tableResult:repeating]
                      private java.lang.Object org.apache.wicket.MarkupContainer.children [class=org.apache.wicket.markup.html.list.ListItem, path=2:tableResult:repeating:0]
                        private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;]
                          java.lang.Object org.apache.wicket.Component.data[1] [class=org.apache.wicket.markup.html.basic.Label, path=2:tableResult:repeating:0:automezzo]
                            java.lang.Object org.apache.wicket.Component.data [class=org.apache.wicket.model.PropertyModel]
                              private java.lang.Object org.apache.wicket.model.ChainingModel.target [class=it.loginet.buonicarico.domain.utente.Viaggio] <----- field that is causing the problem
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:362)
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:341)
24/02/2018 09:06:22629 ERROR-JavaSerializer-ERROR序列化对象类it.loginet.buonicarico.presentation.ViaggioListPage[object=[Page class=it.loginet.buonicarico.presentation.ViaggioListPage,id=2,呈现计数=1]]
org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException:对象类型不可序列化!
检查类型为it.loginet.buonicarico.domain.utete.Viaggio的对象时出现问题
字段层次结构是:
2[class=it.loginet.buonicarico.presentation.ViaggioListPage,path=2]
private java.lang.Object org.apache.wicket.MarkupContainer.children[class=[Ljava.lang.Object;]
private java.lang.Object org.apache.wicket.MarkupContainer.children[5][class=org.apache.wicket.markup.html.WebMarkupContainer,path=2:tableResult]
private java.lang.Object org.apache.wicket.MarkupContainer.children[class=[Ljava.lang.Object;]
私有java.lang.Object org.apache.wicket.MarkupContainer.children[0][class=org.apache.wicket.markup.html.navigation.PagingNavigator,path=2:tableResult:navigator]
private java.lang.Object org.apache.wicket.MarkupContainer.children[class=[Ljava.lang.Object;]
private java.lang.Object org.apache.wicket.MarkupContainer.children[0][class=org.apache.wicket.markup.html.navigation.paging.PagingNavigation,path=2:tableResult:navigator:navigation]
private java.lang.Object org.apache.wicket.MarkupContainer.children[class=org.apache.wicket.markup.html.list.LoopItem,path=2:tableResult:navigator:navigation:0]
私有java.lang.Object org.apache.wicket.MarkupContainer.children[class=org.apache.wicket.markup.html.navigation.paging.PagingNavigationLink,path=2:tableResult:navigator:navigation:0:pageLink]
受保护的最终org.apache.wicket.markup.html.navigation.paging.IPageable org.apache.wicket.markup.PagingNavigationLink.pageable[class=org.apache.wicket.markup.html.list.PageableListView,path=2:tableResult:重复]
private java.lang.Object org.apache.wicket.MarkupContainer.children[class=org.apache.wicket.markup.html.list.ListItem,path=2:tableResult:repeating:0]
private java.lang.Object org.apache.wicket.MarkupContainer.children[class=[Ljava.lang.Object;]
java.lang.Object org.apache.wicket.Component.data[1][class=org.apache.wicket.markup.html.basic.Label,path=2:tableResult:repeating:0:automezzo]
java.lang.Object org.apache.wicket.Component.data[class=org.apache.wicket.model.PropertyModel]

私有java.lang.Object org.apache.wicket.model.ChainingModel.target[class=it.loginet.buonicarico.domain.utete.Viaggio]您的所有标签都引用属性模型,属性模型本身直接引用您的实体

根据经验法则,您不应调用
IModel#getObject()
,并将其结果保留的时间超过需要的时间:

    final WebMarkupContainer container = new WebMarkupContainer("tableResult");
    container.setOutputMarkupId(true);
    PageableListView<Viaggio> repeating = new PageableListView<Viaggio>("repeating", viaggiListModel, 10) {
        @Override
        protected void populateItem(ListItem<Viaggio> item) {
            final IModel<Viaggio> viaggio = item.getModel();

            item.add(new Label("data", new AbstractReadOnlyModel<String>() {
                public String getObject() {
                    return new SimpleDateFormat("dd-MM-yyyy").format(viaggio.getObject().getData())
                }
            });
            item.add(new Label("automezzo", new PropertyModel(viaggio, "targaMotrice")));
            item.add(new Label("autista", new PropertyModel(viaggio, "primoAutista")));
            item.add(new EnumLabel("status", new PropertyModel(viaggio, "status")));
......
final WebMarkupContainer=新的WebMarkupContainer(“tableResult”);
container.setOutputMarkupId(true);
PageableListView repeating=新的PageableListView(“repeating”,viaggiListModel,10){
@凌驾
受保护的void populateItem(列表项){
最终IModel viaggio=item.getModel();
添加(新标签(“数据”,新AbstractReadOnlyModel)(){
公共字符串getObject(){
返回新的SimpleDataFormat(“dd-MM-yyyy”).format(viaggio.getObject().getData())
}
});
添加(新标签(“automezzo”,新PropertyModel(viaggio,targaMotrice”));
添加(新标签(“autista”,新PropertyModel(viaggio,“Primoutistta”));
添加(新EnumLabel(“状态”),新PropertyModel(viaggio,“状态”));
......
除了AbstractReadOnlyModel,您还可以使用PropertyModel,并让转换器对日期进行格式化