jsf-2 - primefaces 可编辑数据表中的 EnumConverter

标签 jsf-2 primefaces converters

我编写了一个 EnumConverter,如 Use enum in h:selectManyCheckbox 中所述。 ?一切都很好,直到我们认识到该转换器在 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 可编辑数据表之外,一切都很好。有什么解决方案可以实现这一点吗?

最佳答案

出现此问题的原因是自定义组件属性未保存在 PrimeFaces 数据表的行状态中(在标准 h:dataTable 中工作正常)。

我们需要将此信息存储在其他地方。在 View 范围内加上组件 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());

关于jsf-2 - primefaces 可编辑数据表中的 EnumConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12581958/

相关文章:

jsf-2 - JSF 2 托管 bean 未实例化

session - 在两个不同的应用程序之间传递 session 数据

jsf-2 - Primefaces 数据表中单选按钮的 onRowSelect

java - 来自 p :autoComplete 的 primefaces 更新面板

java - 在 Java 中将时间转换为 float ,反之亦然

c# - Windows Phone - 字节数组到 BitmapImage 转换器抛出异常

security - 在 Glassfish 上进行 Realm 身份验证后重定向

java - 为纯 AJAX 构建 JSF 2 应用程序

java - 如何使用数据网格内的民意调查安全地切换 primefaces 面板

python - 在 Python 和 Perl 上绑定(bind) C 库但相反