【问题标题】:Primefaces strange error with datatablePrimefaces 数据表出现奇怪错误
【发布时间】:2013-03-07 05:42:11
【问题描述】:

我正在开发一个显示 datatable 的页面,与 primefaces 展示中显示的相同。但它不像那样工作。当我运行一两行的页面时它可以工作,但是当我运行页面时多于两行的服务器显示错误[如果我将datatable 设置为editable,那么它也不起作用]。当我将bean 设置为session scoped 而不是request or view 时问题解决了。问题是为什么它不适用于请求或视图范围?

来源:

页面:

                    <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

}

俱乐部项目:

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)

【问题讨论】:

标签: java jsf jakarta-ee primefaces


【解决方案1】:

如果我们要向表中添加超过两行,这似乎 primefaces 需要创建会话。如果我在 bee 的构造函数之前或中激活会话,那么它可以正常工作。我没有原因,但它发生。

添加

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

解决问题。

【讨论】:

  • CDI的主流实现有两种:Seam(seamframework.org/Weld)和CODI(cwiki.apache.org/EXTCDI)。我个人更喜欢 CODI,因为它提供了非常好的功能,例如对话范围和 @ViewAccessScoped 注释。 @ViewAccessScoped 注解类似于@ViewScoped 注解。但是,只要从 jsf 页面引用它,它就会存在。这意味着如果您刷新页面,它不会被破坏,并且可以通过页面传递。我发现使用@ViewAccessScoped 而不是@ViewScoped 可以解决很多问题
  • 我也不确定混合 CDI bean(@ViewScoped 注释)和 EJB(@ManagedBean 注释)是否好。您可以使用 @Named 注释,它会自动在 JNDI 中注册您的 bean,您将能够使用它的名称在 jsf 页面中访问
  • 我认为问题可能出在您未显示的列之一
  • @phoenix7360 @ManagedBean 是 JSF 注释而不是 EJB 注释。此外,您正在混合来自 JSF 和 CDI 的元素(例如仅来自 JSF 的 @ViewScoped 以及 MyFaces CODI 中用于 CDI 的类似注释)。我建议您首先学习基础知识,而不是误导和迷惑人们(注意,OP 只使用 JSF,没关系)
  • @LuiggiMendoza 组件,例如 用于剩余 bean 属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2011-01-08
  • 2023-03-16
  • 2016-04-20
  • 1970-01-01
相关资源
最近更新 更多