Jsf 2 primefaces可编辑数据表中的EnumConverter

Jsf 2 primefaces可编辑数据表中的EnumConverter,jsf-2,primefaces,converter,Jsf 2,Primefaces,Converter,我编写了一个EnumConverter,如中所述?一切都很好,直到我们认识到这个转换器在primefaces可编辑数据表中不能正常工作。问题是,尽管我在getAsString和getAsObject方法中添加了一个属性,如下所示: @Override public String getAsString(FacesContext context, UIComponent component, Object value) { if (value instanceof Enum

我编写了一个EnumConverter,如中所述?一切都很好,直到我们认识到这个转换器在primefaces可编辑数据表中不能正常工作。问题是,尽管我在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));
        }
    }
@覆盖
公共字符串getAsString(FacesContext上下文、UIComponent、对象值){
if(枚举的值实例){
component.getAttributes().put(ATTRIBUTE_ENUM_TYPE,value.getClass());
返回((枚举)值).name();
}否则{
抛出新的ConverterException(新的FacesMessage(“值不是枚举:”+Value.getClass());
}
}
公共对象getAsObject(FacesContext上下文、UIComponent组件、字符串值){
类enumType=(类)component.getAttributes().get(属性\枚举\类型);
试一试{
返回Enum.valueOf(enumType,value);
}捕获(IllegalArgumentException e){
抛出new ConverterException(new FacesMessage(“值不是类型为“+enumType”)的枚举);
}
}

在后一种方法中(
getAsObject
)找不到我赋予组件属性映射的属性。但在pTimeFaces可编辑数据表之外,一切都很好。是否有任何解决方案可以实现这一点?

导致此问题的原因是,自定义组件属性未保存在PrimeFaces datatable的行状态中(在标准
h:datatable
中工作正常)

我们需要将这些信息存储到其他地方。在视图范围中,组件ID是一种方式

getAsString()
中:

getAsObject()
中:

Class enumType=(Class)context.getViewRoot().getViewMap().get(ATTRIBUTE_ENUM_TYPE+component.getId());
context.getViewRoot().getViewMap().put(ATTRIBUTE_ENUM_TYPE + component.getId(), value.getClass());
Class<Enum> enumType = (Class<Enum>) context.getViewRoot().getViewMap().get(ATTRIBUTE_ENUM_TYPE + component.getId());