枚举中的EnumConverter可编辑数据表

时间:2012-09-25 11:24:35

标签: jsf-2 primefaces converter

我写了Use enum in h:selectManyCheckbox中描述的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));
        }
    }

在后一种方法(getAsObject)中找不到我给组件属性映射的属性。但是在pprimefaces可编辑的数据表中,一切都很好。有没有解决办法来实现这个目标?

1 个答案:

答案 0 :(得分: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());