Primefaces DataTable 排序不正确

Primefaces DataTable not sorting properly

我是 Java EE webapp 开发人员(spring、hibernate、jsf、primefaces),我发现了 primefaces 组件 DataTable 的问题。该问题涉及列排序,特别是具有特殊字符的单词的排序。

在我的语言(捷克语)中,我们使用(č、ř、ž 等)这样的字符,以这些字符开头的单词排在 table 的末尾。这就是问题所在。它们应该按照适当的字母排序,例如"č" 应该在 "c" 之后,"ř" 应该在 "r" 之后等等,而不是所有没有特殊字符的记录之后。

我已经在使用 Spring Framework 提供的 CharacterEncoding 过滤器,它应该对每个请求和响应强制使用字符集 (UTF-8)。但这并不能解决问题。这是过滤器的配置:

<filter>
    <filter-name>charEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

有没有办法纠正这种行为?

我希望像这样以编程方式进行操作对您也有用。 entities 这里只是一个 List<String>:

<p:dataTable value="#{testBean.entities}" var="ent">
    <p:column headerText="..." sortBy="#{ent}" sortFunction="#{testBean.sort}">
        #{ent}
    </p:column>
</p:dataTable>

Bean方法:

public int sort(Object ent1, Object ent2) {
    String s1 = (String) ent1;
    String s2 = (String) ent2;

    Collator collator = Collator.getInstance(new Locale("cs"));  //Your locale here
    collator.setStrength(Collator.IDENTICAL);
    return collator.compare(s1, s2);
}

Collator 当然可以在 bean 上做一个 属性 来提高性能。

如果只是默认排序,只需将上面的 sortBysortFunction 移动到 p:datatable 标签即可。