2012-09-25 5 views
5

Use enum in h:selectManyCheckbox에 설명 된 EnumConverter를 작성 했습니까? 이 변환기가 primeface editable datatable에서 제대로 작동하지 않는다는 것을 알기 전까지는 아무 문제가 없었습니다. 내가 구성 요소에 준 속성을 찾을 수 없습니다편집 가능한 데이터 테이블 primefaces의 EnumConverter

@Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     if (value instanceof Enum) { 
      component.getAttributes().put(ATTRIBUTE_ENUM_TYPE, value.getClass()); 
      return ((Enum<?>) value).name(); 
     } else { 
      throw new ConverterException(new FacesMessage("Value is not an enum: " + value.getClass())); 
     } 
    } 
public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     Class<Enum> enumType = (Class<Enum>) component.getAttributes().get(ATTRIBUTE_ENUM_TYPE); 
     try { 
      return Enum.valueOf(enumType, value); 
     } catch (IllegalArgumentException e) { 
      throw new ConverterException(new FacesMessage("Value is not an enum of type: " + enumType)); 
     } 
    } 

후자의 방법 (getAsObject)에서지도 속성 : 문제는 내가 다음과 같이 getAsString 및 getAsObject 방법 내부 속성을 추가하지만 것입니다. 그러나 편집 가능한 datatable pprimefaces에서 모든 것이 좋습니다. 이것을 달성하기위한 해결책이 있습니까?

답변

2

이 문제는 사용자 지정 구성 요소 특성이 PrimeFaces 데이터 테이블의 행 상태에 저장되지 않았기 때문에 발생합니다 (표준 h:dataTable에서 정상적으로 작동 함).

이 정보는 다른 곳에 저장해야합니다. 컴포넌트 ID와 함께 뷰 범위에서 하나의 방법이 될 것입니다. getAsString()에서

:

context.getViewRoot().getViewMap().put(ATTRIBUTE_ENUM_TYPE + component.getId(), value.getClass()); 

그리고 getAsObject()의 :

Class<Enum> enumType = (Class<Enum>) context.getViewRoot().getViewMap().get(ATTRIBUTE_ENUM_TYPE + component.getId()); 
+0

고마워요! 나를 위해 일했다. – demdem

관련 문제