2013-03-07 3 views
1

datatable primefaces 쇼케이스에 표시된 것과 동일한 페이지를 개발하고 있습니다.하지만 그것을 작동하지 않습니다. 내가 하나 또는 두 개의 행이있는 페이지를 실행할 때 그것은 작동하지만 실행하면 두 개 이상의 행이 서버에있는 페이지가 오류를 보여줍니다 [내가 datatableeditable으로 설정하면 작동하지 않습니다.] 대신 request or view 빈을 설정할 때 문제가 해결되었습니다. 질문이 요청 또는보기 범위에서 작동하지 않는 이유는 무엇입니까?Primefaces 이상한 오류 datatable 함께

출처 :

페이지 :

    <p:dataTable var="club" value="#{currentClubItems.clubItems}" id="clubs" 
         > 

         <p:ajax event="rowEdit" listener="#{currentClubItems.onEdit}" update=":form:messages"/> 

         <p:column headerText="Main Category" style="width:15%"> 
          <p:cellEditor> 
           <f:facet name="output"> 
            <h:outputText value="#{club.mainCategory}"/> 
           </f:facet> 
           <f:facet name="input"> 
            <p:selectOneMenu value="#{club.mainCategory}" editable="true"> 
             <f:selectItems value="#{currentClubItems.categories}" 
                 var="ct" 
                 itemLabel="#{ct}" 
                 itemValue="#{ct}"/> 
            </p:selectOneMenu> 
           </f:facet> 
          </p:cellEditor> 
         </p:column> 

         <!-- other coloms--> 

         <p:column style="width:5%"> 
          <p:rowEditor/> 
         </p:column> 

        </p:dataTable> 

콩 :

@ViewScoped 
@ManagedBean(name = "currentClubItems") 
public class CLMItems implements Serializable { 
    private List<ClubItem> clubItems; 

    public CLMItems(){ 
     clubItems=new ArrayList<ClubItem>(); 

     ClubItem clubItem=new ClubItem(); 
     clubItem.setId("1"); 
     clubItem.setMainCategory("category"); 
     clubItem.setSubCategory("sub category"); 
     clubItem.setMerchant("Merchant"); 
     clubItem.setOffer("Content goes here.."); 

     //add more items...... 
} 

//getters and setters 

} 

ClubItem :

public class ClubItem implements Serializable { 

    private String id; 
    private String mainCategory; 
    private String subCategory; 
    private String merchant; 
    private String offer; 

//getters and setters 

} 

오류 :

java.lang.IllegalStateException: Cannot create a session after the response has been committed 
    at org.apache.catalina.connector.Request.doGetSession(Request.java:2705) 
    at org.apache.catalina.connector.Request.getSession(Request.java:2231) 
    at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:899) 
    at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:155) 
    at com.sun.faces.renderkit.ServerSideStateHelper.writeState(ServerSideStateHelper.java:175) 
    at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122) 
    at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:166) 
    at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:225) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:419) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:619) 
+0

실제 코드를 사용하면 실제 문제가 발생하기 쉽지 않습니다. –

+0

Ok 코드가 최소화되었습니다. – sampathpremarathna

+0

가능한 중복 [IllegalStateException : 응답이 커밋 된 후 세션을 만들 수 없음] (http://stackoverflow.com/questions/8072311/illegalstateexception-cannot-create-a-session-after- 응답이있다 - commi) – BalusC

답변

0

테이블에 두 개 이상의 행을 추가하려고하면 프라임 페이스 세션이 필요합니다. 이전에 세션을 활성화했거나 생성자에서 세션을 활성화하면 정상적으로 작동합니다. 이유가 없습니다. 그러나 그것은 일어난다.

//bean constructor 
public CLMItems(){ 
FacesContext.getCurrentInstance().getExternalContext().getSession(true); 
// other stuff 
} 

이 문제를 해결 추가 할 수 있습니다.

+0

CODI에서 @ViewAccessScoped를 사용해 보셨습니까? – phoenix7360

+0

CODI 란 무엇을 의미합니까, 미안 ... 잘 모르겠습니다 .... – sampathpremarathna

+0

Seam (http://seamframework.org/Weld)과 CODI (https : //cwiki.apache)의 두 가지 주류 구현이 있습니다. org/EXTCDI /). Conversation 스코프 및 @ViewAccessScoped 주석과 같은 아주 멋진 기능을 제공하므로 개인적으로 CODI를 선호합니다. '@ ViewAccessScoped' 주석은'@ ViewScoped' 주석과 유사합니다. 그러나 그것은 jsf 페이지에서 참조되는 한 오래 지속됩니다. 페이지를 새로 고치면 페이지 위로 넘길 수 있다는 의미입니다. '@ ViewScoped' 대신에'@ViewAccessScoped'를 사용하면 많은 문제를 해결할 수 있습니다. – phoenix7360