2013-05-22 7 views
1

변수의 subClass 속성에 어떻게 도달 할 수 있습니까? Primefaces 예제에서 Car.color, Car.shape와 같은 속성에 접근 할 수 있지만 원하는 것은 "Car.PriceInformations.Price"입니다. 나는 자동차 [column.property] [column.subproperty]를 시도했지만 작동하지 않았다. 서브 테이블을 사용해야합니까, 아니면 더 좋은 해결책이 있습니까? 테이블 콩의 유일한 컬렉션 TableBean#carsSmall 인 경우Primefaces 동적 테이블 속성

<p:dataTable id="cars" var="car" value="#{tableBean.carsSmall}" filteredValue="#{tableBean.filteredCars}">      
    <p:columns value="#{tableBean.columns}" var="column" columnIndexVar="colIndex" 
       sortBy="#{car[column.property]}" filterBy="#{car[column.property]}"> 
     <f:facet name="header"> 
      #{column.header} 
     </f:facet> 

     #{car[column.property]} 
    </p:columns> 

</p:dataTable> 
+0

은'Car.PriceInformations' 컬렉션입니까? 컬렉션의 항목 중 하나에 액세스 하시겠습니까? – erencan

+0

자바 클래스에서 동일한 속성에 액세스하려고 시도하십시오. 편집기가이 표현식에 대한 오류/제안을 표시 할 수 있으므로 액세스 할 수 있습니까? – Jitesh

+0

@erencan 컬렉션이 아닙니다. 그냥 객체 –

답변

1

필요에 따라 this BalusC answer을 수정할 수 있습니다.

기본적으로 SpringBeanFacesELResolver은 EL 해결 프로그램에 사용할 때 확장 할 수 있습니다. 그러나 EL 해석자는 Spring 컨텍스트 내에서 Spring Bean을 찾고있다. Source code은 SpringBenFacesELResolver의 기능을 잘 이해하고 있습니다.

두 번째로 BalusC 응답에서 설명하는대로 관리 빈 값에 액세스하려면 javax.el.BeanELResolver이 필요합니다. 이 목적을 위해 Java Reflections를 사용합니다. javax.el.BeanELResolver은 실행 시간에 SpringBeanFacesELResolver 동적으로로드 할 수 있으며 참조 된 응답과 마찬가지로 중첩 된 속성의 경우 SpringBeanFacesELResolver#getValue을 호출합니다.

public class ExtendedSpringELResolver extends SpringBeanFacesELResolver { 

@Override 
public Object getValue(ELContext context, Object base, Object property) 
{ 
    if (property == null || base == null || base instanceof ResourceBundle || base instanceof Map || base instanceof Collection) { 
     return null; 
    } 

    String propertyString = property.toString(); 

    if (propertyString.contains(".")) { 
     Object value = base; 
     Class []params= new Class[]{ELContext.class,Object.class,Object.class}; 
     for (String propertyPart : propertyString.split("\\.")) { 

      Class aClass = BeanELResolver.class; 

      try { 
       Method getValueMethod = aClass.getDeclaredMethod("getValue",params); 
       value = getValueMethod.invoke(aClass.newInstance(), context, value, propertyPart); 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InstantiationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (SecurityException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (NoSuchMethodException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

     return value; 
    } 
    else { 
     return super.getValue(context, base, property); 
    } 

} 

}

추신 : 여기

코드입니다 PrimeFaces showcase에 예제 코드가 있습니다. 나는 String colorColor color으로 바꾼다. Color은 단지 String 비례가있는 내 케이스의 사용자 정의 클래스이다. 열 목록에 color.color을 추가하여 값에 액세스합니다.

private String columnTemplate = "model manufacturer year color.color"; 
0

, 다음 JSF 페이지에 <p:columns>를 사용하지 마십시오.

<p:dataTable var="car" value="#{tableBean.carsSmall}> 
    <p:column headerText="Car brand"> 
     <h:outputText value="#{car.manufacturer.name}" /> 
    </p:column> 
    <p:column headerText="Color"> 
     <h:outputText value="#{car.color.name}" /> 
     <h:outputText value="#{car.color.code}" /> 
    </p:column> 
</p:dataTable> 

그리고 (당신의 클래스가 다른 이름을 가질 것 같은) 당신의 TableBean, ManufacturerColor 클래스에 적절한 getter 및 setter를 생성하는 것을 잊지 마세요.

+0

다른 컬렉션이 있으므로 을 사용해야합니다. –

+0

'colIndexVar 속성의 표현식을 사용하여 필드에 액세스해야하기 때문에'# {car [colIndex] .property}'를 시도해보십시오.이것이 해결책이 아니라면 빈 코드를 제공하십시오. 빈 필드가 어떤 유형인지 알아야합니다. 그렇지 않으면 그냥 추측입니다. – klimpond