3

我对 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
}

}
4

1 回答 1

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();
    }
}
于 2015-04-15T08:46:07.043 回答