验证失败时,PF自动完成显示错误的标签

时间:2013-08-19 14:11:10

标签: jsf 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
}

}

1 个答案:

答案 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();
    }
}