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

时间:2014-01-10 10:58:25

标签: primefaces datatable

使用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标签的自定义排序功能,它可以正常工作。

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,我就这样解决了。

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

Sorter.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>

答案 1 :(得分:0)

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

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

我的解决方法是在sortFunction中为name方法定义“getter”,并在辅助bean中创建Method Expression。

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(...),您可以在其中实现排序逻辑。

享受! :)