5

h:selectManyCheckbox で enum を使用しますか?で説明されている EnumConverter を作成しました。このコンバーターがプライムフェイスの編集可能なデータテーブルで適切に機能しないことがわかるまでは、すべて問題ありませんでした。問題は、次のように getAsString および getAsObject メソッド内に属性を追加したにもかかわらずです。

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

後者の method( getAsObject) では、コンポーネントの属性マップに指定した属性が見つかりませんでした。しかし、pprimefaces の編集可能なデータテーブルからは、すべて問題ありません。これを達成するための解決策はありますか?

4

1 に答える 1

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());
于 2012-09-25T13:15:39.337 に答える