Primefaces 数据表自定义排序功能与动态列

问题描述 投票:0回答:3

使用 Primefaces 3.5,当我尝试将自定义排序功能与动态列一起使用时,我得到了

PropertyNotFoundException

我的xhtml文件中的数据表是(只需显示相关代码)

<p:dataTable id="dataTableVersioneMonitoraggio" var="row" value="# {monitoraggioBean.pacchetti}" 
                 rowKey="#{row.pacchetto.id}">

<p:columns value="#{monitoraggioBean.columns}" var="column"
           sortBy="#{row.celle[column.posizione].cella.valore}"
                sortFunction="#{monitoraggioBean.customSort}">               
  ...         
</p:columns>

</p:dataTable>

我的视图范围支持 bean 中不完整的方法是:

public int customSort(Object val1, Object val2) {
    System.out.println("mySort" + val1 + "/" + val2);
    return 0;
}

问题是我无法在 bean 中访问此方法,并且出现以下错误:

GRAVE [javax.enterprise.resource.webcontainer.jsf.context] (http--0.0.0.0-8080-3) javax.el.PropertyNotFoundException: /monitoraggio.xhtml @80,161 sortFunction="#{monitoraggioBean.customSort}": The class 'com.packman.bean.MonitoraggioBean' does not have the property 'customSort'.

我尝试过使用 p:column 标签的自定义排序功能,它有效。

有什么想法吗?

谢谢

primefaces datatable
3个回答
3
投票

我也遇到过类似的问题,我是这样解决的。

首先,我创建了一个 Sorter 类(助手),然后通过 EL 在我的 JSF 页面中使用它。

排序器.java

@Component
public class Sorter {


    /**
     * Compares two objects that are Strings on their int value. Can be used to sort any column that contains Integer-based data.
     * @param obj1
     * @param obj2
     * @return
     */
    public int sortIdByString(Object obj1,Object obj2){
        int id1 = Integer.parseInt((String)obj1);
        int id2 = Integer.parseInt((String)obj2);
        if(id1 < id2){
            return -1;
        }else if(id1 == id2){
            return 0;
        }else{
            return 1;
        }
    }
}

JSF 页面

<p:column headerText="#{msgs['page.customer.detail.vendingMachine.number']}"
    sortBy="#{vendingMachine.nummer}" sortFunction="#{sorter.sortIdByString}">
    <h:outputText value="#{vendingMachine.nummer}"/>
</p:column>

2
投票

我想出了一个解决方案/解决方法。我认为这是 Primefaces 3.5 在 p columns 标签和 sortFunction 属性上的错误。

Primefaces 需要

sortFunction="#{monitoraggioBean.customSort}"
上的方法表达式,但它希望将其视为值表达式并尝试查找 getter/setter 方法。

我的解决方法是为 sortFunction 中的名称方法定义“getter”,并在支持 bean 中创建方法表达式。

public MethodExpression getOrdina() {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{monitoraggioBean.ordina}", Integer.class, new Class[]{Object.class, Object.class});
}

自定义排序的方法也必须在 bean 中定义:

public int customSort(Object val1, Object val2) {
    System.out.println("mySort" + val1 + "/" + val2);
    return 0;
}

这样,当您单击列标题时,首先调用 getOrdina(),然后调用 customSort(...),您可以在其中实现排序逻辑。

享受! :)


0
投票

@Dani 你能告诉我更多关于ordina的信息吗?

© www.soinside.com 2019 - 2024. All rights reserved.