Предварительная проверка h:manyCheckbox после выбора значения из h:selectOneMenu в JSF 2

Я хочу предварительно проверить несколько флажков после выбора значения из раскрывающегося списка и вызова valueChangeListener в раскрывающемся списке. Ниже приведен код:

На странице JSF:

<h:selectOneMenu id="roleName" styleClass="text" value="#{role.roleID}" valueChangeListener="#{role.processValueChange}" immediate="true" onchange="submit()">
    <f:selectItem itemLabel="--Select--" itemValue="--Select--"></f:selectItem>
    <f:selectItems noSelectionValue="--Select--" value="#{role.rolesVoList}" var="x" itemLabel="#{x.roleName}" itemValue="#{x.roleID}" />
</h:selectOneMenu>

<p>
    <h:outputText value="Notifications" styleClass="label" />
</p>
<p>
    <h:selectManyCheckbox id="notificationPrivileges" value="#{role.notificationPrivileges}" layout="pageDirection">
        <f:selectItems value="#{role.notificationPrivilegeMap}" />
    </h:selectManyCheckbox>
</p>

В управляемом компоненте:

private List<RolesVo> rolesVoList;
    private boolean checkBoxSet = false;
    private List<Integer> notificationPrivileges;
    private Map<String, Integer> notificationPrivilegeMap;
    private RolePrivilegeVo rolePrivilege;

    public void processValueChange(ValueChangeEvent event) {
        messageHandler = new MessageHandler();
        int newValue = (Integer) event.getNewValue();
        setRoleID(newValue);
        try {
            rolePrivilege = roleService.getRolePrivileges(newValue);
            setNotificationPrivileges(rolePrivilege.getPrivilegeIDs());
            setCheckBoxSet(true);

        } catch (Exception e) {
            messageHandler.addGlobalErrorMessage(OATSConstants.errorFetchPrivilege);
        }

    }

getPrivilegeIDs() возвращает список целых чисел. Форма отправляется, и метод valueChangeListener успешно обрабатывается, но после этого флажки не устанавливаются. Пожалуйста, укажите мне, что я делаю неправильно. Любая помощь очень ценится.


person gauravdott    schedule 02.05.2012    source источник
comment
Ваш код трудно понять. Свойства, указанные в представлении, не соответствуют свойствам, указанным в модели. Кажется, что ваши геттеры/сеттеры имеют разные имена методов, чем имена свойств. Пожалуйста, уделяйте немного больше внимания такого рода несоответствиям в ваших будущих вопросах.   -  person BalusC    schedule 02.05.2012
comment
Ой, извините, я вставил не ту переменную. Я отредактировал его. Извините, что не вставил полный код, так как он загромождает вопрос. roleVoList — это Map‹String, Integer› для меток и значений ролей, roleID — целое число. Также я пробовал использовать ‹f:ajax›, но получаю тот же результат, а флажки не установлены.   -  person gauravdott    schedule 02.05.2012
comment
Вы использовали конвертер, как описано в моем ответе?   -  person BalusC    schedule 02.05.2012
comment
Нет, не использовал. Я попробую использовать его, сейчас я не в офисе и не имею доступа к репозиторию. Я обязательно сообщу вам, сработало ли это. Еще раз спасибо за помощь!   -  person gauravdott    schedule 02.05.2012
comment
@BalusC Я попробовал ваше предложение, но оно не сработало. Вот ссылки на управляемый компонент и представление соответственно. Пожалуйста, укажите, что я делаю неправильно pastebin.com/4PyDk0zR pastebin.com/tYJh2CfQ   -  person gauravdott    schedule 03.05.2012


Ответы (1)


Это не удается, потому что вы явно не указали преобразователь для <h:selectManyCheckbox>. Вы используете обобщенные коллекции, такие как List и Map. EL не поддерживает дженерики и по умолчанию интерпретирует все как String. Это не удастся на equals() тестах, чтобы проверить, должен ли элемент быть проверен или нет.

Поскольку вы используете Integer, вам нужно указать преобразователь javax.faces.Integer:

<h:selectManyCheckbox ... converter="javax.faces.Integer">

Не связанный с конкретной проблемой, вы используете старый хак JSF 1.x, злоупотребляя valueChangeListener с immediate="true" и onchange="submit() для заполнения другого компонента. Это довольно неуклюже и может привести к сбою всякий раз, когда вы используете проверку в любом месте в той же форме. Вместо этого используйте новый тег <f:ajax>, предоставленный JSF 2.0. Тогда это будет выглядеть следующим образом:

<h:selectOneMenu id="roleName" styleClass="text" value="#{role.roleID}">
    <f:selectItem itemLabel="--Select--" itemValue="--Select--"></f:selectItem>
    <f:selectItems noSelectionValue="--Select--" value="#{role.rolesVoList}" var="x" itemLabel="#{x.roleName}" itemValue="#{x.roleID}" />
    <f:ajax listener="#{role.processValueChange}" render="rolePrivileges" />
</h:selectOneMenu>

<p>
    <h:outputText value="Role Management" styleClass="label" />
</p>
<p>
    <h:selectManyCheckbox id="rolePrivileges" value="#{role.rolePrivileges}" layout="pageDirection" converter="javax.faces.Integer">
        <f:selectItems value="#{role.rolePrivilegeMap}" />
    </h:selectManyCheckbox>
</p>

с участием

public void processValueChange(AjaxBehaviorEvent event) {
    // ...
}
person BalusC    schedule 02.05.2012