2013-05-16 2 views
4

지금까지는 LazyDataModel 인 JSF 관리 Bean을 다음과 같이 보았습니다.java.lang.ArithmeticException : Primefaces LazyDataModel이 0 인 경우

@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); 
    } 
} 

정상적으로 작동하는 몇 가지 매우 기본적인 데이터베이스 작업을 수행하는 다른 방법이 있습니다.


나는이 빈 관리에 몇 가지 쿼리 문자열 매개 변수를 제공 할 필요가 있기 때문에, 나는 @Controller, @ManagedBean, @RequestScoped@Autowired 같은 단지 주석을 제거하여 수정 한 (이 봄 3.2.2와 통합되어 있습니다).

관리 빈은 다음 faces-config.xml 파일 등으로 구성된이 JSF,이 수정으로

<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> 

, 나는 다음과 같은 예기치 않은 예외를 얻었다. 나는 다음과 같은 관리 빈에 setRowIndex() 방법을 오버라이드 할 때

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) 

예외

은 사라졌다.

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

그렇다면이 문제는 Primeface에서 발생합니까? 저는 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

관련 문제