如果p:selectCheckboxMenu值指定为Collection<Object>需要添加converter
<p:selectCheckboxMenu value="#{articleController.currentArticle.categoryList}"
converter="categoryConvert" multiple="true">
<f:selectItems value="#{categoryController.categoryList}"
var="category" itemLabel="#{category.name}" itemValue="#{category}"/>
</p:selectCheckboxMenu >
<p:commandButton action="#{articleController.create()}" update="@form" value="#{bundle.submit}"/>
@FacesConverter(value = "categoryConvert", forClass = Category.class)
public static class CategoryConvert implements Converter<Category> {
@Override
public Category getAsObject(FacesContext context, UIComponent component, String value) {
if(value == null || value.length() == 0) {
return null;
}
CategoryController controller = (CategoryController)context.getApplication().getELResolver().
getValue(context.getELContext(), null, "categoryController");
return controller.getCategoryFacade().find(getKey(value));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Category value) {
if(value == null) {
return null;
}
if(value instanceof Category) {
Category ca = (Category)value;
return getStringKey(ca.getId());
} else {
throw new IllegalArgumentException("object " + value
+ " is of type " + value.getClass().getName()
+ "; expected type: " + CategoryController.class.getName());
}
}
如果不指定converter属性,转换器不会被调用。