2012-09-25 6 views
5

Use enum in h:selectManyCheckboxで説明されているEnumConverterを書いていますか?このコンバーターは、編集可能なプライマリのデータテーブルでは正しく動作しないことがわかるまで、すべてのことがうまくいきました。 Iコンポーネントに与えた属性を見つけることができなかった編集可能なプライマリの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)におけるMAP属性:問題は、私は次のようgetAsStringとgetAsObjectメソッド内部属性を追加しているがあることです。しかし、pprimefacesのうち、編集可能なデータテーブルのすべては問題ありません。これを達成するための解決策はありますか?

答えて

2

この問題は、カスタムコンポーネントの属性がPrimeFacesデータテーブルの行状態に保存されていないために発生します(標準で正常に動作します)。

私たちはこの情報を他の場所に保存する必要があります。ビューのスコープでは、コンポーネント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

関連する問題