java.lang.ArithmeticException:/使用Primefaces LazyDataModel为零

时间:2013-05-16 15:48:54

标签: jsf primefaces

到目前为止,我有一个LazyDataModel的JSF托管bean看起来如下所示。

@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和{{1}等注释(它与Spring 3.2.2集成)。

然后在@Autowired文件中配置此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>

只有当我覆盖托管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) 方法时,异常才会消失,如下所示。

setRowIndex()

那么,这是Primefaces的一个问题吗?我正在使用Mojarra 2.1.9和Primefaces 3.5。它看起来真是一个问题here。在这种情况下,以这种方式覆盖@Override public void setRowIndex(int rowIndex) { if(rowIndex==-1||getPageSize()==0) { super.setRowIndex(-1); } else { super.setRowIndex(rowIndex%getPageSize()); } } 方法是否足够?

1 个答案:

答案 0 :(得分: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);
}