【问题标题】:Primefaces Datatable sortField null and filters map {} when created programatically以编程方式创建时 Primefaces Datatable sortField null 和过滤器映射 {}
【发布时间】:2025-12-08 15:30:01
【问题描述】:

当以编程方式(使用绑定和 valExp)创建惰性数据表时,sortField 始终为空,排序顺序为升序,过滤器映射 {}。即单击排序字段或在过滤字段中键入字符串。

如果在没有绑定的情况下完成相同的操作,一切都在 xhtml 视图中,一切都像宣传的那样工作。我还查看了 PhaseListener 加载顺序,在这两种情况下都没有发现任何不同之处,只是一开始它不起作用。

TestController 是 @ViewScoped。尝试使用 PF 版本 3.5、3.4.2、3.3.1、3.3。

我做错了吗?

查看

<p:dataTable binding="#{testController.datatable}" />   

  <p:dataTable value="#{testController.testModel}" var="val" rows="5" lazy="true">
     <p:column sortBy="#{val}">
        #{val}
     </p:column>
  </p:dataTable>

一代

datatable = new DataTable();
  datatable.setValueExpression("lazy",createValueExpression("true", Boolean.class));
  datatable.setValueExpression("rows",createValueExpression("10", Integer.class));
  datatable.setValueExpression("value",createValueExpression("#{testController.testModel}", DataModel.class));
  datatable.setVar("val");


  Column column = new Column();
  column.setValueExpression("sortBy", createValueExpression("#{val}", String.class));

  HtmlOutputText output = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
  output.setValueExpression("value", createValueExpression("#{val}", String.class));

  column.getChildren().add(output);

  datatable.getChildren().add(column);

型号

public List<String> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
    List<String> modelMock = new ArrayList<String>() {
        {
            add("abc");
            add("def");
        }
    };
    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("load()");
    }

    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("first " + first + " pageSize" + pageSize);

        LOGGER.debug("sortField -> " + sortField);
        LOGGER.debug("sortOrder -> " + sortOrder);
        LOGGER.debug("filters -> " + filters);
    }

    this.setRowCount(modelMock.size());

    return modelMock;
}

调试输出

11:12:24,426 DEBUG TestModel:33 - load()
11:12:24,426 DEBUG TestModel:37 - first 0 pageSize10
11:12:24,426 DEBUG TestModel:39 - sortField -> null
11:12:24,426 DEBUG TestModel:40 - sortOrder -> ASCENDING
11:12:24,426 DEBUG TestModel:41 - filters -> {}

第二个数据表证明当它不与绑定一起使用时,它可以工作

11:21:25,677 DEBUG TestModel:33 - load()
11:21:25,677 DEBUG TestModel:37 - first 0 pageSize5
11:21:25,677 DEBUG TestModel:39 - sortField -> val
11:21:25,677 DEBUG TestModel:40 - sortOrder -> DESCENDING

【问题讨论】:

    标签: java jsf jsf-2 primefaces datatable


    【解决方案1】:

    binding”元素和“@ViewScoped”范围之间存在问题。 你可以在这里阅读更多信息:http://balusc.blogspot.com/2010/06/benefits-and-pitfalls-of-viewscoped.html#HeyTheresPitfallsInTheTitle

    如果您想保持绑定和当前范围,一个解决方案是启用组件的完整状态保存。您可以通过将其添加到您的 web.xml

    来为指定页面设置它
    <context-param>
        <!-- For Bug Fixing Viewscope beans with binding component attributes -->
        <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
        <param-value>/faces/myPageWithBindings.xhtml</param-value>
    </context-param>
    

    【讨论】:

    • 使用 javax.faces.FULL_STATE_SAVING_VIEW_IDS 的缺点是什么?开销?
    • 它可以通过增加内存使用来影响性能。你可以在这里阅读信息:*.com/questions/10337015/…