Установка значений с использованием Primefaces selectManyCheckbox для свойства Java не работает

Я хочу выбрать значения из меню selectManyCheckbox Primefaces и установить выбранные значения в свойство, которое будет использоваться позже в методе записи в базу данных. Вот код со страницы .xhtml для компонента:

<p:selectManyCheckbox id="chkbox1"
                    value="#{requestBean.filterTypeBean.selectedBooleanFilterTypes}"
                    layout="pageDirection" converter="filterTypeConverter">
                    <f:selectItems var="checkbox"
                        value="#{requestBean.filterTypeBean.listBooleanFilterTypes()}"
                        itemLabel="#{checkbox.filterTypeName}" itemValue="#{checkbox}" />

            </p:selectManyCheckbox>

Класс RequestBean - это @ViewScoped, и внутри него у меня есть:

private FilterTypeBean filterTypeBean = new FilterTypeBean(); // Plus public get and set method for it

Класс FilterType - это @SessionScoped, и в нем у меня есть:

private List<TFilterType> selectedBooleanFilterTypes; //plus public get and set methods

public List<TFilterType> listBooleanFilterTypes() {
            EntityManager em = HibernateUtil.getEntityManager();
            Query q = em
                    .createQuery("select u from TFilterType u where u.filterType = 'B'");
            List<TFilterType> resultList = q.getResultList();
            return resultList;
        }

Для меня все выглядит нормально, но когда я нажимаю commandButton, список selectedBooleanFilterTypes пуст, даже если я выбираю некоторые значения из selectManyCheckbox. Я пытаюсь получить значения в классе RequestBean, используя метод getSelectedBooleanFilterTypes():

List<TFilterType> selectedBooleanFilterTypes = filterTypeBean
                .getSelectedBooleanFilterTypes();

Кажется, что setSelectedFilterTypesNames() не выполняется. Любое предложение, в чем проблема здесь и как ее исправить? Заранее спасибо!

Вопрос: Деталь конвертера:

  public Object getAsObject(FacesContext context, UIComponent component, String value) {
        // It will create bean when not done yet.
        FilterTypeBean filterTypeBean = context.getApplication().evaluateExpressionGet(context, "#{filterTypeBean}", FilterTypeBean.class);

        for (TFilterType type : filterTypeBean.listBooleanFilterTypes()) {
            if (type.getFilterTypeName().equals(value)) {
                return type;
            }
        }
        return null;
    }

person Tot    schedule 30.04.2014    source источник
comment
Прежде всего переместите всю эту логику из файла listBooleanFilterTypes. Не выполняйте бизнес-логику в геттере. Затем проверьте, не происходит ли сбой преобразования и вызывается ли установщик   -  person kolossus    schedule 30.04.2014
comment
При первой загрузке метод SET все еще не выполняется, он выдает форму ошибки: ‹имя›: Ошибка проверки: значение недействительно. Когда я перезагружаю страницу, установщик устанавливает метод, и он работает, но я не могу понять, почему возникает проблема при каждой первой загрузке после перезапуска сервера и запуска приложения.   -  person Tot    schedule 01.05.2014
comment
Эта ошибка исходит от преобразователя, поскольку значение свойства равно null. Как заставить значение быть установленным при первой загрузке страницы? Если я что-то не так объяснил, пожалуйста, спросите меня!   -  person Tot    schedule 01.05.2014
comment
Вы удалили логику из listBooleanFilterTypes?   -  person kolossus    schedule 01.05.2014
comment
Да, но похоже проблема в другом. Я только что отладил его и увидел, что в свойстве есть значение, но при первом коммите кодировка не та, и он не может преобразовать его из строки в объект (в методе getAsObject) и возвращает NULL. Есть идеи?   -  person Tot    schedule 01.05.2014
comment
Метод Converter добавлен в вопрос.   -  person Tot    schedule 01.05.2014
comment
Вы рассмотрели возможные причины, перечисленные в ответе, на который я ссылался?   -  person kolossus    schedule 01.05.2014
comment
Благодаря этому сообщению: stackoverflow.com/questions/10721342/, теперь это работает. Вам тоже спасибо за помощь!   -  person Tot    schedule 01.05.2014


Ответы (1)


Это поможет мне решить мою проблему:

@WebFilter("*.jsf")
public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub  
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }
}

Я следую этому отправка формы UTF-8 в JSF искажает данные < /а> ссылка.

person Tot    schedule 01.05.2014