我有一个奇怪的行为与表面' 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
}
}
答案 0 :(得分:0)
您的转换器是正确的,因为失败的验证不会触发值和PrimeFaces的转换p:autoComplete使用提交的值在验证失败时显示,而不是先前设置的正确值。我们通过替换
更改AutoCompleteRenderer
来解决此问题
if(ac.isValid()) {
requestMap.put(var, ac.getValue());
itemLabel = ac.getItemLabel();
}
else {
Object submittedValue = ac.getSubmittedValue();
itemLabel = (submittedValue == null) ? null : String.valueOf(submittedValue);
if(itemLabel == null && ac.getValue() != null) {
requestMap.put(var, ac.getValue());
itemLabel = ac.getItemLabel();
}
}
与
if(ac.isValid()) {
requestMap.put(var, ac.getValue());
itemLabel = ac.getItemLabel();
}
else {
// Display label of previously set value if validation fails
itemLabel = ac.getItemLabel();
if(itemLabel == null && ac.getValue() != null) {
requestMap.put(var, ac.getValue());
itemLabel = ac.getItemLabel();
}
}