在selectCheckboxMenu中使用转换器自定义对象不起作用

时间:2016-07-06 09:56:04

标签: jsf primefaces

我正在尝试将转换器用于自定义对象,这些对象用于素数'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仍然列出了对象,而不是字符串。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

如果您需要在checkboxMenu标签中显示汽车名称,则必须使用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>
BTW不要声明两个转换器(一个通过转换器属性,另一个通过f:转换器),并正确覆盖getAsObject方法(在Apply Request Values阶段需要它)。查看docs了解详情