Конвертер в Primefaces PickList - PullRequest
       34

Конвертер в Primefaces PickList

2 голосов
/ 14 августа 2011

Я использую PickList от Primefaces и не могу заставить его работать. Моя проблема - конвертер. Я следовал указаниям другого поста, но тщетно.

Вот мое лицо

<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;
    }
}

Категория состоит из идентификатора (int) и описания (String) Я хочу, чтобы как исходные, так и целевые списки отображали описание String и выбранные категории, заданные в виде списка категорий в моем компоненте. Оба списка правильно загружены в bean-компонент, а DualListModel заполняется в предпочитаемой категории. Проблема в том, что PickList даже не отображается. Ничего не происходит, никакая ошибка не отображается, страница просто прекращает рендеринг, когда ходы приходят в PickList, и я думаю, что это из-за неправильного использования конвертера. Какой будет правильный способ реализовать мой этот случай?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 11 марта 2014

Это работает без исключения 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 голосов
/ 14 августа 2011

Я думаю

@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.

0 голосов
/ 17 июня 2013

я сделал один простой конвертер, и он хорошо работает со всеми значениями в 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));
    }
}
0 голосов
/ 22 сентября 2011

Я не знаю, решили ли вы свою проблему, но если нет, вы можете попробовать это. В методе getAsObject вы создаете новый объект категории, устанавливаете его идентификатор и возвращаете его. Я думаю, что вы должны сделать здесь - получить категорию из базы данных с этим идентификатором, а затем вернуть ее.

0 голосов
/ 14 августа 2011

В этой строке:

@FacesConverter(forClass=CategoryLevelView.class,value="categoryLevelConverter")

Похоже, вы пытаетесь установить идентификатор конвертера в categoryLevelConverter.

В этой строке вашего Facelet:

converter="#{categoryConverter}"

Идентификатор конвертера не совпадает.

...