2017-04-21 119 views
1

目前我正在玩JSF,我有一个数据表,值将被加载时,有史以来搜索过滤器已经完成,向前移动我有一个导出按钮,导出数据为xls格式。在这种情况下数据被导出。类演员异常JSF

但是,当没有搜索完成,数据表是空的只有列标题,并通过点击导出图标。我收到以下异常,这里是堆栈跟踪和图像连接参考

Apr 21, 2017 4:37:24 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute 
WARNING: javax.faces.model.ListDataModel cannot be cast to org.primefaces.model.LazyDataModel 
java.lang.ClassCastException: javax.faces.model.ListDataModel cannot be cast to org.primefaces.model.LazyDataModel 
    at org.primefaces.component.datatable.DataTable.clearLazyCache(DataTable.java:964) 
    at org.primefaces.component.export.Exporter.exportAll(Exporter.java:224) 
    at org.primefaces.component.export.ExcelExporter.export(ExcelExporter.java:59) 
    at org.primefaces.component.export.DataExporter.processAction(DataExporter.java:97) 
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) 
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:300) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:105) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at com.ppts.setting.SessionFilter.doFilter(SessionFilter.java:38) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 

Apr 21, 2017 4:37:24 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/GEO_DM] threw exception [javax.faces.model.ListDataModel cannot be cast to org.primefaces.model.LazyDataModel] with root cause 
java.lang.ClassCastException: javax.faces.model.ListDataModel cannot be cast to org.primefaces.model.LazyDataModel 
    at org.primefaces.component.datatable.DataTable.clearLazyCache(DataTable.java:964) 
    at org.primefaces.component.export.Exporter.exportAll(Exporter.java:224) 
    at org.primefaces.component.export.ExcelExporter.export(ExcelExporter.java:59) 
    at org.primefaces.component.export.DataExporter.processAction(DataExporter.java:97) 
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) 
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:300) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:105) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at com.ppts.setting.SessionFilter.doFilter(SessionFilter.java:38) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 

下面是我用

<label>Export</label> <span class="info-box-title"> <h:panelGrid 
columns="2" border="0" cellpadding="3" cellspacing="5"> 
<h:commandLink> 
    <img src="images/excel.png" class="img-responsive" /> 
    <p:dataExporter type="xls" target="removetagtbl" 
     fileName="LeaverJoinerDataxls" 
     postProcessor="#{leaverJoinerTagReportBean.postProcessXLS}"/> 

</h:commandLink> 

<h:commandLink style="padding-right: 20px;"> 
    <img src="images/csv.png" /> 
    <p:dataExporter type="csv" target="removetagtbl" 
     fileName="LeaverJoinerDatacsv" /> 
</h:commandLink> 

我用LazyDataModel所有DATAS添加到JSF代码一个清单

请指导我,并纠正我,如果有任何错误。

enter image description here

下面是使用LazyDataModel

public class LeaverJoinerReportLazyModel extends LazyDataModel<LeaverJoinerTagReportDTO> { 

    private static final long serialVersionUID = 1L; 

    private List<LeaverJoinerTagReportDTO> datasource; 

    public LeaverJoinerReportLazyModel(List<LeaverJoinerTagReportDTO> datasource) { 
     this.datasource = datasource; 
    } 

    @Override 
    public LeaverJoinerTagReportDTO getRowData(String rowKey) { 
     for (LeaverJoinerTagReportDTO leaverJoinerTagReportDTO : datasource) { 
      if (leaverJoinerTagReportDTO.getLineId().equals(rowKey)) 
       return leaverJoinerTagReportDTO; 
     } 
     return null; 
    } 

    @Override 
    public Object getRowKey(LeaverJoinerTagReportDTO leaverJoinerTagReportDTO) { 
     return leaverJoinerTagReportDTO.getLineId(); 
    } 

    @Override 
    public List<LeaverJoinerTagReportDTO> load(int first, int pageSize, 
      String sortField, SortOrder sortOrder, Map<String, Object> filters) { 

     List<LeaverJoinerTagReportDTO> dataList = new ArrayList<LeaverJoinerTagReportDTO>(); 

     // filter 
     for (LeaverJoinerTagReportDTO leaverJoinerTagReportDTO : datasource) { 
      boolean match = true; 

      if (filters != null) { 
       for (Iterator<String> iterator = filters.keySet().iterator();iterator.hasNext();) { 
        try { 
         String sFilterProperty = iterator.next(); 
         Object sFilterValue = filters.get(sFilterProperty); 
         String sFieldValue = String.valueOf(leaverJoinerTagReportDTO.getClass().getField(sFilterProperty).get(leaverJoinerTagReportDTO)); 
         if (sFilterValue == null || sFieldValue.startsWith(sFilterValue.toString())) { 
          match = true; 
         } else { 
          match = false; 
          break; 
         } 
        } catch (Exception e) { 
         match = false; 
        } 
       } 
      }else{ 
       //Do Nothing 
      } 

      if (match) { 
       dataList.add(leaverJoinerTagReportDTO); 
      } 
     } 

     // rowCount 
     int dataSize = dataList.size(); 
     this.setRowCount(dataSize); 

     // paginate 
     if (dataSize > pageSize) { 
      try { 
       return dataList.subList(first, first + pageSize); 
      } catch (IndexOutOfBoundsException e) { 
       return dataList.subList(first, first + (dataSize % pageSize)); 
      } 
     } else { 
      return dataList; 
     } 
    } 

} 

回答

2

我觉得例外是相当清楚的准备清单的代码,是不是?您在某处使用javax.faces.model.ListDataModel,并且Primefaces尝试在clearLazyCache-方法中将其转换为org.primefaces.model.LazyDataModel

LazyDataModel可以被铸造到DataModel(upcast,总是可能的),因此如果在运行期间的实际类型是LazyDataModel之前,您可能会隐式地将其转回(向下)。

java.lang.Object 
    javax.faces.model.DataModel<T> 
    org.primefaces.model.LazyDataModel<T> 

https://www.primefaces.org/docs/api/5.0/org/primefaces/model/LazyDataModel.html

ListDataModel是另一棵树叶的一部分,因此该转换失败。

java.lang.Object 
    javax.faces.model.DataModel<E> 
    javax.faces.model.ListDataModel<E> 

http://docs.oracle.com/javaee/6/api/javax/faces/model/ListDataModel.html

也许你应该添加豆代码,不仅页面的标记。

+0

嗨,但我没有在我的项目中的任何地方使用ListDataModel,请参考我已附加的代码,在bean中前进我只是获取上面的类的对象,并使用该对象,迭代在JSF页面中完成在数据表中使用各自的豆的获得者 –

+0

你使用PF 5.1吗? https://code.google.com/archive/p/primefaces/issues/7947 – dognose

+0

是的,我使用PF 5.1 –

1

如果在数据表上使用lazy =“true”,则必须在数据表中使用LazyDataModel作为值。如果你想使用一个普通的Java列表,就把它设置为false。