dem*_*dem 5 converter primefaces jsf-2
我写了一个EnumConverter,在h:selectManyCheckbox中使用enum中描述?一切都很好,直到我们发现这个转换器在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));
}
}
Run Code Online (Sandbox Code Playgroud)
在后一种方法中,(getAsObject
)找不到我给组件属性映射的属性.但是在pprimefaces可编辑的数据表中,一切都很好.有没有解决方案来实现这一目标?
导致此问题的原因是自定义组件属性未保存在 PrimeFaces 数据表的行状态中(在 standard 中工作正常h:dataTable
)。
我们需要将这些信息存储在其他地方。在视图范围内加上组件 ID 是一种方法。
在里面getAsString()
:
context.getViewRoot().getViewMap().put(ATTRIBUTE_ENUM_TYPE + component.getId(), value.getClass());
Run Code Online (Sandbox Code Playgroud)
并在getAsObject()
:
Class<Enum> enumType = (Class<Enum>) context.getViewRoot().getViewMap().get(ATTRIBUTE_ENUM_TYPE + component.getId());
Run Code Online (Sandbox Code Playgroud)