Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 Primefaces选择器列表中的转换器_Jsf 2_Primefaces_Converter - Fatal编程技术网

Jsf 2 Primefaces选择器列表中的转换器

Jsf 2 Primefaces选择器列表中的转换器,jsf-2,primefaces,converter,Jsf 2,Primefaces,Converter,我在使用Primefaces的选择列表,但我无法让它工作。我的问题是转换器。我听从了另一个帖子的指示,但徒劳无功 这是我的脸 <p:pickList value="#{customerBean.preferredCategories}" var="category" itemLabel="#{category.description}" itemValue="#{category}" converter="#{categoryConverter}"> </p:pickLi

我在使用Primefaces的选择列表,但我无法让它工作。我的问题是转换器。我听从了另一个帖子的指示,但徒劳无功

这是我的脸

<p:pickList value="#{customerBean.preferredCategories}" var="category"
   itemLabel="#{category.description}" itemValue="#{category}" converter="#{categoryConverter}">
</p:pickList>
类别由一个id(int)和一个描述(String)组成 我希望源列表和目标列表都显示描述字符串,并将所选类别设置为我的bean中的类别列表。这两个列表都正确加载到bean中,DualListModel填充在preferredCategories中。问题是拾取列表甚至没有呈现。什么都没有发生,没有显示错误,当轮到PickList时页面停止渲染,我认为这是因为转换器使用错误。在这个案例中,哪种方法是正确的

谢谢。

在这行:

@FacesConverter(forClass=CategoryLevelView.class,value="categoryLevelConverter")
看起来您正在尝试将转换器id设置为
categoryLevelConverter

在Facelet的这一行中:

converter="#{categoryConverter}"
转换器id不匹配。

我认为

@FacesConverter(forClass=CategoryLevelView.class,value="categoryConverter")
public class CategoryConverter implements Converter {
应该是

@FacesConverter(forClass=Category.class,value="categoryConverter")
public class CategoryConverter implements Converter {
将class的
值更改为
Category.class


而且,您不需要在
中提及
转换器
属性的值。我不知道您是否已经解决了问题,但如果没有,您可以尝试一下。
getAsObject
方法中,您要做的是创建一个新的类别对象,设置其id并返回它。我认为您应该在这里使用该id从数据库中获取类别,然后返回该类别。

我制作了一个简单的转换器,它可以很好地处理Primefaces PickList中的所有值:

@facescoverter(“PickListConverter”)
公共类PickListConverter实现转换器{
公共对象getAsObject(FacesContext FacesContext、UIComponent组件、字符串submittedValue){
picklistp=(PickList)组件;
DualListModel dl=(DualListModel)p.getValue();
返回dl.getSource().get(Integer.valueOf(submittedValue));
}
公共字符串getAsString(FacesContext FacesContext、UIComponent组件、对象值){
picklistp=(PickList)组件;
DualListModel dl=(DualListModel)p.getValue();
返回字符串.valueOf(dl.getSource().indexOf(value));
}
}

此操作不会出现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();
}
}
@facescoverter(“PickListConverter”)
公共类PickListConverter实现转换器{
公共对象getAsObject(FacesContext FacesContext、UIComponent组件、字符串submittedValue){
picklistp=(PickList)组件;
DualListModel dl=(DualListModel)p.getValue();
对于(int i=0;i
您可以在任何答案下添加注释。只需单击显示“添加注释”的链接即可。此代码使用选取列表的索引(0、1、2等)来标识哪些选取列表项已从源移动到目标。虽然这可能是处理picklist和转换器的最简单、最优雅的方法,
getSource.indexOf(value)
有时返回-1(当
value
已经在Target中时),因此在
getAsObject
中会出现
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();
}
}