我正在尝试将转换器用于自定义对象,这些对象用于素数'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
仍然列出了对象,而不是字符串。
我错过了什么吗?
答案 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了解详情