【问题标题】:Primefaces Datatable custom sort Function with dynamic columnsPrimefaces Datatable自定义排序功能与动态列
【发布时间】:2014-01-10 10:58:24
【问题描述】:

使用 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


【解决方案1】:

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

首先,我创建了一个 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 列标记和 sortFunction 属性上的错误。

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

    我的解决方法是在 sortFunction 中为 name 方法定义“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(...),您可以在其中实现排序逻辑。

    享受吧! :)

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 2018-12-10
      相关资源
      最近更新 更多