Ошибка проверки JSF из-за компонента, который не отображается

У меня есть форма с полем, которое необходимо отображать как значение только для чтения в режиме редактирования и как раскрывающийся список выбора в режиме создания.

Поле только для чтения (используемое в режиме редактирования) отображается как обычный текст с использованием <h:outputText>. В режиме создания поле отображается <h:selectOneListbox> с обязательным атрибутом "true".

Кажется, в большинстве случаев это работает так, как я ожидаю, но иногда я получаю ошибку проверки в режиме редактирования (окно списка выбора не отображается).

Вот фрагмент кода, в котором оба поля определены с их отображаемыми атрибутами, установленными с использованием одного и того же логического значения (только одно поле отменяет логическое значение для переключения).

<h:outputLabel id="lblBusinessArea" value="Business Area:" />
<h:panelGroup id="baGroup">
    <h:selectOneListbox id="businessAreaList" size="1"
            rendered="#{shiftDetailsController.canEditBusinessArea}" 
            converter="businessAreaConverter"
            value="#{shiftDetailsController.selectedBusinessArea}"
            label="Business Area"
            required="true">
        <f:selectItems id="businessAreaListItems" value="#{shiftDetailsController.businessAreas}" />
        <a4j:support id="businessAreaA4j" event="onchange"
            ajaxSingle="true" reRender="deploymentGroupList, positionPayGroupList, sapPremCodeList" />
    </h:selectOneListbox>
    <h:outputText id="businessAreaRO" 
         rendered="#{!shiftDetailsController.canEditBusinessArea}" 
         value="#{shiftDetailsController.selectedBusinessArea.busAreaDesc}" />
</h:panelGroup>

Ниже приведена вырезка экрана, показывающая поле (в режиме редактирования), отображаемое как доступное только для чтения. Была нажата кнопка «Сохранить», и я получаю сообщение об ошибке проверки, что поле является обязательным.

  1. Значение должно быть в компоненте поддержки, поскольку отображаемое значение относится к тому же объекту (shiftDetailsController.selectedBusinessArea). Выходной текст использует поле описания в объекте бизнес-области, а поле выбора использует весь объект, где SelectItem имеет описание в метке.

поле отображается как доступное только для чтения с появлением сообщения проверки

Любая идея, как это может происходить? Я мог бы установить требуемый атрибут, используя то же логическое значение, которое определяет состояние рендеринга... чтобы он требовался только при рендеринге... но, поскольку эта проблема носит периодический характер... я не знаю, что это действительно поможет .

Я также проверил, что никакие другие компоненты на странице непреднамеренно не имеют значения метки «Бизнес-область» (которое используется в сообщении проверки), чтобы ввести меня в заблуждение, в котором компонент действительно имеет нулевое значение; это единственная компания с пометкой «Бизнес-зона».


person Steve    schedule 15.12.2011    source источник


Ответы (1)


Я понял, что происходит с этой проблемой.

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

rendered="#{shiftDetailsController.canEditBusinessArea}"

Другими словами, то, что я делал в форме, вызывало изменение значений canEditBusinessArea. Но я не перерисовывал группу панелей ("baGroup"), чтобы пользовательский интерфейс отражал обновление.

Таким образом, когда моя форма была отправлена, компонент на этапе проверки считался обязательным... инициируя проверку. Как только я добавил «baGroup» в reRender действия, которое переключало флаг редактирования бизнес-области, пользовательский интерфейс начал отражать обновление, и отправленная форма имела значение.

person Steve    schedule 16.12.2011