Primefaces PickList中的转换器

时间:2011-08-14 18:04:14

标签: jsf-2 primefaces converter

我正在使用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时页面停止渲染,我认为这是因为转换器的错误使用。这是实施我的案例的正确方法吗?

感谢。

5 个答案:

答案 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));
    }
}