【问题标题】:java.lang.ArithmeticException: / by zero with Primefaces LazyDataModeljava.lang.ArithmeticException: / Primefaces LazyDataModel 为零
【发布时间】:2013-05-16 15:48:54
【问题描述】:

到目前为止,我有一个带有 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@Autowired 等注释(它与 Spring 3.2 集成.2)。

然后在faces-config.xml 文件中配置此 JSF 托管 bean,例如,

<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()方法是否足够?

【问题讨论】:

标签: jsf primefaces


【解决方案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);
}

【讨论】:

  • 谢谢,稍后查看。
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2012-06-04
相关资源
最近更新 更多