JSF2невозможно найти компонент с идентификатором - PullRequest
2 голосов
/ 09 марта 2012

Я строю стол, используятег, а его длина является динамической.Каждый ряд имеетполе.Когда форма отправляется, она устанавливает значения из формы в хэш-карту.Это все прекрасно работает, за исключением проверки.Мне нужно сказатьк какому входу он относится, используя атрибут for.Я попытался создать уникальный идентификатор для каждой строки на основе имени элемента, используемого для создания строки.Нотег остается пустым, когда я отправляю неверный ввод, и я получаю следующий вывод в журнале сервера (JBoss 7.1):

[javax.enterprise.resource.webcontainer.jsf.renderkit]
Unable to find component with ID nTAS in view.

Вот XHTML:

<ui:repeat var="item" ...>
...
<h:inputText value="#{bean.chosenItems[item.name]}" id="n#{item.name}" >
    <f:validateLongRange minimum="0" maximum="10" />
</h:inputText>
<h:message for="n#{item.name}" />
...
</ui:repeat>

В порядкепо крайней мере, чтобы получить какое-то сообщение об ошибке в браузере, я также добавил это в верхней части моей страницы, и оно работает:

<h:messages styleClass="error" />

Отображается это сообщение:

j_idt13:j_idt17:1:n: Validation Error: Value is not of the correct type.

И этот тип показывает часть проблемы, поскольку идентификатор - это тот странный код в начале сообщения, и он начинается с «n», но не содержит имени элемента.Если я посмотрю на источник в браузере, то на самом деле это идентификатор: id="j_idt13:j_idt17:1:nTAS"

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

И что действительно странно, так это то, что, когда я вводлю «asdf» во второй раз и повторно отправляю форму, он затем вызывает метод действия для bean-компонента, вместо того, чтобы снова давать сбой во время фазы проверки !!Как это может быть?!

Спасибо за любые подсказки, Джон

1 Ответ

5 голосов
/ 09 марта 2012

Вы не можете создавать идентификаторы динамически с выражениями el.И «загадочные» идентификаторы действительно генерируются jsf, если вы не назначаете идентификатор компоненту.

Но вам не нужно заботиться об уникальности ваших идентификаторов в ui:repeat.JSF сделает это за вас («1» в сгенерированной строке идентификатора является счетчиком для вашего повторяющегося компонента).Просто дайте в поле ввода «фиксированный» идентификатор и укажите его в своем h: message:

<h:inputText value="#{bean.chosenItems[item.name]}" id="myID" >
    <f:validateLongRange minimum="0" maximum="10" />
</h:inputText>
<h:message for="myID" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...