2014-01-10 64 views
2

使用Primefaces 3.5時,當我嘗試對動態列使用自定義排序功能時,得到一個PropertyNotFoundExceptionPrimefaces可動態列的數據表自定義排序功能

我在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'. 

我已經嘗試過定製排序函數的n與p:列標籤,它的工作原理。

有什麼想法?

感謝

回答

0

,我想出了一個解決方案/解決方法。我認爲這是p欄標籤和sortFunction屬性上Primefaces 3.5的一個bug。

Primefaces期望在sortFunction="#{monitoraggioBean.customSort}"上有一個方法表達式,但它希望將其視爲值表達式,並試圖找出getter/setter方法。

我的解決方法是爲sortFunction中的name方法定義「getter」,並在backing 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}); 
} 

自定義排序的mehod必須在bean過定義:

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

這樣,當你點擊一列先getOrdina(的頭)被調用,然後customSort(...),在那裏你可以實現你的排序邏輯。

享受! :)

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>