我对 primefaces' 有一种奇怪的行为autocomplete
。
当我提交没有验证错误或其他表单字段错误的表单时,该组件可以正常工作。但是,如果自动完成验证失败,则标签将替换为项目@Id
字段。
我怀疑我正在使用的转换器有问题。转换器所做的基本上是获取实体的@Id 值并将实际实体插入到组件的属性映射中,并以@Id 值作为其键。
这是我的xhtml:
<p:autoComplete
id="autoComp"
value="#{action.timeTable}"
completeMethod="#{action.timeTables}"
var="tt"
itemLabel="#{tt.description}"
itemValue="#{tt}"
dropdown="true"
minQueryLength="3"
forceSelection="true"
converter="entityConverter"
size="30"
required="true"
maxResults="10">
<f:validator validatorId="customValidator" />
</p:autoComplete>
这是我的转换器代码:
@FacesConverter("entityConverter")
public class EntityConverter implements Converter {
@Override
public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
if (value != null) {
return component.getAttributes().get(value);
}
return null;
}
@Override
public String getAsString(FacesContext ctx, UIComponent component, Object obj) {
if (obj instanceof String) {
return obj.toString();
}
if (obj != null) {
String id;
try {
id = this.getId(getClazz(ctx, component), obj);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new ConverterException("msg");
}
id = id.trim();
component.getAttributes().put(id, getClazz(ctx, component).cast(obj));
return id;
}
return null;
}
private Class<?> getClazz(FacesContext facesContext, UIComponent component) {
//get entity's class
}
private String getId(Class<?> clazz, Object obj) throws NoSuchFieldException, IllegalAccessException {
// get entity's ID value
}
}