【问题标题】:Primefaces DataTable SortBy Does Not WorkPrimefaces DataTable SortBy 不起作用
【发布时间】:2017-09-05 11:23:24
【问题描述】:

我需要你的帮助。我的项目中有一个奇怪的错误。我的 xhtml 中有一个 primefaces 数据表,它的列的 sortBy 属性不起作用。当我调试我的代码时, BeanPropertyComparator 类中的 sortBy 似乎为空。 tomcat的错误日志写在下面;

Apache Tomcat 7.0.52 日志

java.lang.IllegalStateException: CDATA tags may not nest
    at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startCDATA(HtmlResponseWriter.java:681)
    at javax.faces.context.ResponseWriterWrapper.startCDATA(ResponseWriterWrapper.java:179)
    at javax.faces.context.PartialResponseWriter.startError(PartialResponseWriter.java:341)
    at org.primefaces.context.PrimePartialResponseWriter.startError(PrimePartialResponseWriter.java:109)
    at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:202)
    at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:126)
    at javax.faces.context.ExceptionHandlerWrapper.handle(ExceptionHandlerWrapper.java:100)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)




Apache Tomcat 7.0.52

javax.faces.FacesException: java.lang.NullPointerException
    at org.primefaces.model.BeanPropertyComparator.compare(BeanPropertyComparator.java:92)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:324)
    at java.util.TimSort.sort(TimSort.java:189)
    at java.util.TimSort.sort(TimSort.java:173)
    at java.util.Arrays.sort(Arrays.java:659)
    at java.util.Collections.sort(Collections.java:217)
    at org.primefaces.component.datatable.feature.SortFeature.singleSort(SortFeature.java:148)
    at org.primefaces.component.datatable.feature.SortFeature.encode(SortFeature.java:106)
    at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:80)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:924)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:559)
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
    at org.primefaces.component.api.UIData.visitTree(UIData.java:827)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIForm.visitTree(UIForm.java:371)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:399)
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:319)
    at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57)
    at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1004)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:425)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.NullPointerException
    at org.primefaces.model.BeanPropertyComparator.compare(BeanPropertyComparator.java:58)
    ... 48 more



当我调试代码时,会用到 BeanPropertyComparator 的 'compare' 方法。参数 sortBy 似乎为“空”。 类及其方法是这样的;

public class BeanPropertyComparator implements Comparator {

    private ValueExpression sortBy;
    private boolean asc;
    private String var;
    private MethodExpression sortFunction;
    private boolean caseSensitive = false;
    private Locale locale;
    private Collator collator;
    private int nullSortOrder;

    public BeanPropertyComparator(ValueExpression sortBy, String var, SortOrder sortOrder, MethodExpression sortFunction, boolean caseSensitive, Locale locale, int nullSortOrder) {
        this.sortBy = sortBy;
        this.var = var;
        this.asc = sortOrder.equals(SortOrder.ASCENDING);
        this.sortFunction = sortFunction;
        this.caseSensitive = caseSensitive;
        this.locale = locale;
        this.collator = Collator.getInstance(locale);
        this.nullSortOrder = nullSortOrder;
    }

    @SuppressWarnings("unchecked")
    public int compare(Object obj1, Object obj2) {
        try {
            FacesContext context = FacesContext.getCurrentInstance();

            context.getExternalContext().getRequestMap().put(var, obj1);
            Object value1 = sortBy.getValue(context.getELContext());
            context.getExternalContext().getRequestMap().put(var, obj2);
            Object value2 = sortBy.getValue(context.getELContext());

错误: ValueExpression sortBy 变为空

我的 xhtml 页面如下;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:b="http://bootsfaces.net/ui"
      xmlns:f="http://java.sun.com/jsf/core">


    <h:head>


    </h:head>

    <h:body>

        <h:form id="formmm">

            <p:dataTable id="dt"
                         var="kullanici"
                         value="#{deneView.ortakKurumKullanicilar}"
                         rowKey="#{kullanici.id}">

                <f:facet name="header">
                    #{etiketler.baslikKullanicilar}
                </f:facet>

                <p:column headerText="#{etiketler.tcKimlikNo}"
                          sortBy="#{kullanici.tckn}">
                    <h:outputText value="#{kullanici.tckn}" />
                </p:column>

                <p:column headerText="#{etiketler.adi}"
                          sortBy="#{kullanici.adi}" >
                    <h:outputText value="#{kullanici.adi}" />
                </p:column>

                <p:column headerText="#{etiketler.soyadi}"
                          sortBy="#{kullanici.soyadi}" >
                    <h:outputText value="#{kullanici.soyadi}" />
                </p:column>

            </p:dataTable>


        </h:form>



    </h:body>

</html>


以及我的 xhtml 的 View

@ManagedBean
@ViewScoped
public class DeneView implements Serializable{

    private List<DeneDomain> ortakKurumKullanicilar;

    @PostConstruct
    public void init() {

        DeneDomain kullanici1 = new DeneDomain();
        kullanici1.setId(1L);
        kullanici1.setAdi("Ahmet");
        kullanici1.setSoyadi("Candemir");
        kullanici1.setTckn("11111111111");
        DeneDomain kullanici2 = new DeneDomain();
        kullanici2.setId(2L);
        kullanici2.setAdi("Mehmet");
        kullanici2.setSoyadi("Zahir");
        kullanici2.setTckn("34738946323");
        DeneDomain kullanici3 = new DeneDomain();
        kullanici3.setId(3L);
        kullanici3.setAdi("Cem");
        kullanici3.setSoyadi("Anil");
        kullanici3.setTckn("23567890546");
        DeneDomain kullanici4 = new DeneDomain();
        kullanici4.setId(4L);
        kullanici4.setAdi("Kazim");
        kullanici4.setSoyadi("Izit");
        kullanici4.setTckn("43256789000");
        DeneDomain kullanici5 = new DeneDomain();
        kullanici5.setId(5L);
        kullanici5.setAdi("Nami");
        kullanici5.setSoyadi("Cagan");
        kullanici5.setTckn("52546546556");
        DeneDomain kullanici6 = new DeneDomain();
        kullanici6.setId(6L);
        kullanici6.setAdi("Zeki");
        kullanici6.setSoyadi("Under");
        kullanici6.setTckn("14324324233");
        DeneDomain kullanici7 = new DeneDomain();
        kullanici7.setId(7L);
        kullanici7.setAdi("Deniz");
        kullanici7.setSoyadi("Fazli");
        kullanici7.setTckn("34454545455");

        ortakKurumKullanicilar = new ArrayList<>();
        ortakKurumKullanicilar.add(kullanici1);
        ortakKurumKullanicilar.add(kullanici2);
        ortakKurumKullanicilar.add(kullanici3);
        ortakKurumKullanicilar.add(kullanici4);
        ortakKurumKullanicilar.add(kullanici5);
        ortakKurumKullanicilar.add(kullanici6);
        ortakKurumKullanicilar.add(kullanici7);
    }

    public List<DeneDomain> getOrtakKurumKullanicilar() {
        return ortakKurumKullanicilar;
    }

    public void setOrtakKurumKullanicilar(List<DeneDomain> ortakKurumKullanicilar) {
        this.ortakKurumKullanicilar = ortakKurumKullanicilar;
    }

}

已编辑

【问题讨论】:

  • 请提供代码。 XHTML 和 JSF !
  • @Makky:最好总是要求minimal reproducible example。只需在评论中输入 [ mcve ](不带空格)
  • @Makky:我已经编辑了我的问题。
  • 你的 PF 版本是多少?
  • primefaces 6.0.它适用于不同的 Web 应用程序。我打开了一个新的jsf项目并添加了相同的域xhtml并查看它工作正常。

标签: java jsf primefaces


【解决方案1】:

我解决了这个问题。 Primefaces dataTable 的属性不起作用。问题在于将 ValueExpression sortBy 的值从 xhtml 发送到 primefaces 的 BeanPropertyComparator 类的“compare”方法。 SortBy 值即将为空。我知道,问题不在于 primefaces,而在于 jsf 2.2。 javax.faces2.2.jar jar 已由 maven 存储库添加,但已损坏。当我右键单击由 maven(pom.xml)创建的依赖项时,选择了手动安装工件选项并更改了由于另一个正常(非 maven)项目而下载的 jar。现在它对我来说很好,但解决后又出现了另一个问题。在filterBy之后,如果我没有删除过滤条目,我无法再次对表格进行排序,所有数据都消失了,直到我删除条目。我了解到它是可序列化接口。我在dataTable 的value 属性中添加了一个列表的域类必须实现Serializable 接口。在我的项目中还有一个 WebService 部分,它有域类。我应该在 Web 项目中使用这些类,但它不能将域视为可序列化,尽管它们是可序列化的。

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2011-07-25
    • 2014-06-08
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多