我正在使用Primefaces的PickList而我无法使其工作。我的问题是转换器。我按照另一篇文章的指示,但徒劳无功。
这是我的小脸
<p:pickList value="#{customerBean.preferredCategories}" var="category"
itemLabel="#{category.description}" itemValue="#{category}" converter="#{categoryConverter}">
</p:pickList>
这里是我的自定义转换器
@FacesConverter(forClass=CategoryLevelView.class,value="categoryLevelConverter")
public class CategoryConverter implements Converter {
public String getAsString(FacesContext context, UIComponent component, Object value) {
return String.valueOf(((Category) value).getId());
}
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
Category category = new Category();
category.setId(Integer.parseInt(value));
return category;
}
}
类别由id(int)和description(String)组成 我希望源列表和目标列表都显示描述字符串,并将所选类别设置为我的bean中的类别列表。两个列表都正确加载到bean中,DualListModel填充在preferredCategories中。问题是PickList甚至没有渲染。没有任何事情发生,没有显示错误,当转弯到达PickList时页面停止渲染,我认为这是因为转换器的错误使用。这是实施我的案例的正确方法吗?
感谢。
答案 0 :(得分:2)
我认为
@FacesConverter(forClass=CategoryLevelView.class,value="categoryConverter")
public class CategoryConverter implements Converter {
应该是
@FacesConverter(forClass=Category.class,value="categoryConverter")
public class CategoryConverter implements Converter {
将forClass
的值更改为Category.class
。
而且,您不需要在converter
中提及<p:picklist
属性的值。
答案 1 :(得分:2)
这没有ArrayIndexOutOfBounds异常。
@FacesConverter("PickListConverter")
public class PickListConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
PickList p = (PickList) component;
DualListModel dl = (DualListModel) p.getValue();
for (int i = 0; i < dl.getSource().size(); i++) {
if (dl.getSource().get(i).toString().contentEquals(submittedValue)) {
return dl.getSource().get(i);
}
}
for (int i = 0; i < dl.getTarget().size(); i++) {
if (dl.getTarget().get(i).toString().contentEquals(submittedValue)) {
return dl.getTarget().get(i);
}
}
return null;
}
public String getAsString(FacesContext facesContext, UIComponent component, Object value) {
PickList p = (PickList) component;
DualListModel dl = (DualListModel) p.getValue();
// return String.valueOf(dl.getSource().indexOf(value));
return value.toString();
}
}
答案 2 :(得分:0)
在这一行:
@FacesConverter(forClass=CategoryLevelView.class,value="categoryLevelConverter")
您似乎正在尝试将转换器ID设置为categoryLevelConverter
。
在你的Facelet的这一行:
converter="#{categoryConverter}"
转换器ID不匹配。
答案 3 :(得分:0)
我不知道你是否已经解决了问题,但如果没有,你可以尝试一下。
在getAsObject
方法中,您正在做的是创建一个新的类别对象并设置其ID并返回它。我认为你应该在这里做的是从数据库中获取具有该id的类别,然后返回它。
答案 4 :(得分:0)
我制作了一个简单的转换器,它适用于Primefaces PickList中的所有值:
@FacesConverter("PickListConverter")
public class PickListConverter implements Converter{
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
PickList p = (PickList) component;
DualListModel dl = (DualListModel) p.getValue();
return dl.getSource().get(Integer.valueOf(submittedValue));
}
public String getAsString(FacesContext facesContext, UIComponent component, Object value) {
PickList p = (PickList) component;
DualListModel dl = (DualListModel) p.getValue();
return String.valueOf(dl.getSource().indexOf(value));
}
}