2012-09-25 12 views
5

Napisałem EnumConverter, który jest opisany w Use enum in h:selectManyCheckbox? Wszystko było w porządku, dopóki nie rozpoznajemy, że ten konwerter nie działa poprawnie w pierwotnych edytowalnych datatable. Problemem jest to, że mimo, że dodaje się atrybut wewnątrz getAsString i getAsObject metodami jak następuje: mapaEnumConverter w pakietach głównych edytowalne datatable

@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)); 
     } 
    } 

W drugiej metodzie (getAsObject) nie może znaleźć cechę, że dał składników atrybutów. Ale z edytowalnych datatable pprimefaces wszystko jest w porządku. Czy istnieje jakieś rozwiązanie, aby to osiągnąć?

Odpowiedz

2

Ten problem jest spowodowany tym, że atrybut komponentu niestandardowego nie został zapisany w stanie wiersza datatable PrimeFaces (działa poprawnie w standardzie h:dataTable).

Będziemy musieli przechowywać te informacje w innym miejscu. W zasięgu widoku wraz z identyfikatorem komponentu byłby jeden sposób.

W getAsString():

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

A w getAsObject():

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

Dzięki dużo! Pracował dla mnie. – demdem