Ошибка проверки 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>
Ниже приведена вырезка экрана, показывающая поле (в режиме редактирования), отображаемое только для чтения. Кнопка "Сохранить" была нажата, и я получаю сообщение об ошибке проверки, что поле является обязательным.
- Значение должно быть в базовом компоненте, потому что отображаемое значение принадлежит тому же объекту (shiftDetailsController.selectedBusinessArea) . В выводимом тексте используется поле описания объекта бизнес-сферы, а в поле выбора используется весь объект, для которого у SelectItem есть описание в метке.
Есть идеи, как это может происходить? Я мог бы установить обязательный атрибут, используя то же логическое значение, которое определяет состояние рендеринга... так, чтобы оно требовалось только при его рендеринге... но так как эта проблема временная... Я не знаю, это действительно поможет,
Я также убедился, что никакие другие компоненты на странице случайно не имеют значения метки "Business Area" (которое используется в сообщении проверки), чтобы ввести меня в заблуждение, в котором компонент действительно имеет нулевое значение; это единственный, который имеет ярлык "Бизнес-зона".
1 ответ
Я понял, что происходит с этой проблемой.
До отправки формы и получения ошибки проверки. Я вносил изменения, которые приводили к изменению флага, управляющего видимостью двух компонентов.
rendered="#{shiftDetailsController.canEditBusinessArea}"
Другими словами, то, что я делал в форме, вызывало canEditBusinessArea
изменить значения. Но я не рендерил группу панелей ("baGroup"), чтобы пользовательский интерфейс отражал обновление.
Таким образом, когда моя форма была отправлена, компонент на этапе проверки был сочтен обязательным... инициирование проверки произошло. Как только я добавил "baGroup" в reRender действия, которое переворачивало флаг редактирования бизнес-области, пользовательский интерфейс начал отражать обновление, и отправленная форма имела значение.