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

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

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

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

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

<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 есть описание в метке.

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

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

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

1 ответ

Решение

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

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

rendered="#{shiftDetailsController.canEditBusinessArea}"

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

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

Другие вопросы по тегам