2013-05-16 39 views
4

到現在爲止,我有一個與LazyDataModel JSF受管bean,看起來像下面。java.lang.ArithmeticException:/由零與Primefaces LazyDataModel

@Controller 
@Scope("request") 
public final class StateManagedBean extends LazyDataModel<StateTable> 
{ 
    @Autowired 
    private StateService stateService; 
    private final List<StateTable>list; 
    private List<StateTable> selectedValues; 
    private List<StateTable> filteredValues; 
    private Long id; 

    public StateManagedBean() 
    { 
     list=null; 
     stateService=null;   
    } 

    @Override 
    public List<StateTable> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) 
    { 
     int rowCount = stateService.rowCount().intValue(); 
     int currentPage = currentPage(first, pageSize); 

     if(rowCount<=currentPage*pageSize-pageSize) 
     { 
      first-=pageSize; 
     } 

     if(pageSize<=0) 
     { 
      FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_FATAL, "Error!", "The page size supplied is incorrect. The current operation has been rejected."); 
      FacesContext.getCurrentInstance().addMessage(null, message); 
      return Collections.emptyList(); 
     } 


     if(filters!=null&&!filters.isEmpty()) 
     { 
      List<StateTable> stateTables = stateService.getList(first, pageSize, sortOrder, sortField, filters); 
      setRowCount(stateTables.size()); 
      return stateTables; 
     } 

     setRowCount(rowCount); 
     return stateService.getList(first, pageSize, sortOrder, sortField); 
    } 
} 

與其他一些方法,執行一些非常基本的數據庫操作工作正常。


因爲我需要幾個查詢字符串參數提供給這個託管bean,我已經修改了它移除就像@Controller@ManagedBean@RequestScoped@Autowired註釋(它與Spring 3.2.2集成)。

這JSF則託管bean是在faces-config.xml文件等構成,

<application> 
    <el-resolver> 
     org.springframework.web.jsf.el.SpringBeanFacesELResolver 
    </el-resolver> 
</application> 

<managed-bean> 
    <managed-bean-name>stateManagedBean</managed-bean-name> 
    <managed-bean-class>admin.mangedbean.StateManagedBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 

    <managed-property> 
     <property-name>stateService</property-name> 
     <value>#{stateService}</value> 
    </managed-property> 

    <managed-property> 
     <property-name>id</property-name> 
     <value>#{param.id}</value> 
     <property-class>java.lang.Long</property-class> 
    </managed-property> 
</managed-bean> 

經過這樣的修改,我得到了以下意外的異常。

INFO: java.lang.ArithmeticException:/by zero 
java.lang.ArithmeticException:/by zero 
    at org.primefaces.model.LazyDataModel.setRowIndex(LazyDataModel.java:62) 
    at org.primefaces.component.api.UIData.setRowModel(UIData.java:409) 
    at org.primefaces.component.api.UIData.setRowIndex(UIData.java:401) 
    at org.primefaces.component.api.UIData.processChildren(UIData.java:289) 
    at org.primefaces.component.api.UIData.processPhase(UIData.java:261) 
    at org.primefaces.component.api.UIData.processDecodes(UIData.java:227) 
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:506) 
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183) 
    at org.primefaces.component.api.UIData.visitTree(UIData.java:639) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIForm.visitTree(UIForm.java:371) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376) 
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:252) 
    at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183) 
    at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:931) 
    at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78) 
    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:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

May 16, 2013 9:11:06 PM com.sun.faces.context.PartialViewContextImpl processPartial 
INFO: java.lang.ArithmeticException:/by zero 
java.lang.ArithmeticException:/by zero 
    at org.primefaces.model.LazyDataModel.setRowIndex(LazyDataModel.java:62) 
    at org.primefaces.component.api.UIData.setRowModel(UIData.java:409) 
    at org.primefaces.component.api.UIData.setRowIndex(UIData.java:401) 
    at org.primefaces.component.api.UIData.processChildren(UIData.java:289) 
    at org.primefaces.component.api.UIData.processPhase(UIData.java:261) 
    at org.primefaces.component.api.UIData.processValidators(UIData.java:241) 
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:508) 
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183) 
    at org.primefaces.component.api.UIData.visitTree(UIData.java:639) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIForm.visitTree(UIForm.java:371) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376) 
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:252) 
    at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183) 
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1170) 
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) 
    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:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

May 16, 2013 9:11:06 PM com.sun.faces.context.PartialViewContextImpl processPartial 
INFO: java.lang.ArithmeticException:/by zero 
java.lang.ArithmeticException:/by zero 
    at org.primefaces.model.LazyDataModel.setRowIndex(LazyDataModel.java:62) 
    at org.primefaces.component.api.UIData.setRowModel(UIData.java:409) 
    at org.primefaces.component.api.UIData.setRowIndex(UIData.java:401) 
    at org.primefaces.component.api.UIData.processChildren(UIData.java:289) 
    at org.primefaces.component.api.UIData.processPhase(UIData.java:261) 
    at org.primefaces.component.api.UIData.processUpdates(UIData.java:253) 
    at org.primefaces.component.datatable.DataTable.processUpdates(DataTable.java:550) 
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:510) 
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183) 
    at org.primefaces.component.api.UIData.visitTree(UIData.java:639) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIForm.visitTree(UIForm.java:371) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376) 
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:252) 
    at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183) 
    at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1229) 
    at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) 
    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:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

例外,當我在類似下面的管理bean推翻了setRowIndex()方法只消失了。

@Override 
public void setRowIndex(int rowIndex) 
{ 
    if(rowIndex==-1||getPageSize()==0) 
    { 
     super.setRowIndex(-1); 
    } 
    else 
    { 
     super.setRowIndex(rowIndex%getPageSize()); 
    } 
} 

所以,這是Primefaces的問題嗎?我正在使用Mojarra 2.1.9和Primefaces 3.5。它看起來像一個問題here。在這種情況下,以這種方式覆蓋setRowIndex()方法是否足夠?

+0

你試過調用expliclitly lazyModel.setPageSize()?我認爲這個問題在https://code.google.com/p/primefaces/issues/detail?id=1544中有描述。 –

+0

不,我不明確地調用該方法。 – Tiny

+0

覆蓋setRowIndex()解決了我的問題。謝謝! ;-) –

回答

1

嘗試添加setPageSize(pageSize);內部加載方法。它會這樣的結果:

@Override 
public List<StateTable> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) 
{ 
    int rowCount = stateService.rowCount().intValue(); 
    int currentPage = currentPage(first, pageSize); 

    if(rowCount<=currentPage*pageSize-pageSize) 
    { 
     first-=pageSize; 
    } 

    if(pageSize<=0) 
    { 
     FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_FATAL, "Error!", "The page size supplied is incorrect. The current operation has been rejected."); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
     return Collections.emptyList(); 
    } 


    if(filters!=null&&!filters.isEmpty()) 
    { 
     List<StateTable> stateTables = stateService.getList(first, pageSize, sortOrder, sortField, filters); 
     setRowCount(stateTables.size()); 
     return stateTables; 
    } 

    setRowCount(rowCount); 
    setPageSize(pageSize); //add this line 
    return stateService.getList(first, pageSize, sortOrder, sortField); 
} 
+0

謝謝,稍後再檢查。 – Tiny

相關問題