2014-01-10 2 views
2

동적 열과 함께 사용자 지정 정렬 함수를 사용하려고하면 Primeface 3.5를 사용하여 PropertyNotFoundException을 얻습니다.Primefaces Datatable 사용자 정의 정렬 동적 열이있는 함수

내 시야 범위 백업 콩에

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

불완전 방법 (단지 관련 코드를 표시)되어 XHTML 파일 내 데이터 테이블은 다음과 같습니다

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

문제는 내가 도달 할 수있다 콩 에서이 방법은 다음과 같은 오류가 발생합니다 :

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

나는 사용자 정의 정렬 functio n : p : column 태그와 함께 작동합니다.

아이디어가 있으십니까?

감사합니다.

답변

0

해결책/해결책을 찾았습니다. 나는 이것이 p columns 태그와 sortFunction 속성에 Primefaces 3.5의 버그라고 생각한다.

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은 콩에 너무 정의 할 수 있습니다) 이런 식으로

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

, 당신은 열 먼저 getOrdina (의 헤더를 클릭라고하며, customSort (...)를 사용하면 정렬 논리를 구현할 수 있습니다.

즐기십시오! :)

3

비슷한 문제가 발생하여이를 해결했습니다.

먼저 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>