我正在尝试对自定义对象使用转换器,这些对象用于素数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 方法(在应用请求值阶段需要它)。查看文档以了解详细信息