在选择复选框菜单中对自定义对象使用转换器不起作用



我正在尝试对自定义对象使用转换器,这些对象用于素数selectCheckboxMenu

这是 JSF 部分:

<p:outputLabel value="#{msg.cars}: " for="cars" />
<p:selectCheckboxMenu id="cars"
    value="#{controller.selected.cars}"
    converter="carConverter" label="#{msg.cars}"
    filter="true" filterMatchMode="startsWith"
    panelStyle="width:200px">
    <f:selectItems
        value="#{controller.available.cars}" />
    <f:converter converterId="carConverter" />
</p:selectCheckboxMenu>

这是我的转换器:

@FacesConverter("carConverter")
public class CarConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String newValue) {
        return null;
    }
    @Override
    public String getAsString(FacesContext context, UIComponent component, Object object) {
        if (object == null) {
            return "";
        }
        if (object instanceof Car) {
            Car car = (Car) object;
            String name = car.getName();
            return name;
        } else {
            throw new ConverterException(new FacesMessage(object + " is not a valid car"));
        }
    }
}

getAsString()返回正确的字符串。但是selectCheckboxMenu仍然列出对象而不是字符串。

我错过了什么吗?

如果您需要在复选框菜单标签中显示汽车名称,则必须使用 selectItems 的 itemLabel 属性

<p:outputLabel value="#{msg.cars}: " for="cars" />
<p:selectCheckboxMenu id="cars"
    value="#{controller.selected.cars}"
    converter="carConverter"
    filter="true" filterMatchMode="startsWith"
    panelStyle="width:200px">
    <f:selectItems value="#{controller.available.cars}" var="car" itemLabel="#{car.name}" itemValue="#{car}"/>
</p:selectCheckboxMenu>

顺便说一句,不要声明两个转换器(一个通过转换器属性,另一个通过 f:converter),并正确覆盖 getAsObject 方法(在应用请求值阶段需要它)。查看文档以了解详细信息

相关内容

  • 没有找到相关文章

最新更新