execute
и render
из <f:ajax>
по умолчанию @this
. Таким образом, только текущий активный компонент будет обработан и обновлен. Когда вы нажимаете кнопку, это не отправит введенное значение и не обновит компонент сообщения.
Исправьте это соответственно:
<f:ajax execute="addquantity" render="addquantity_message" listener="#{listItems.AddQuantityAction}">
...
<h:message id="addquantity_message" for="addquantity"/>
...
</f:ajax>
Кстати, почему бы вам не использовать встроенный javax.faces.Integer
конвертер вместо этого валидатора?
<h:inputText ... converter="javax.faces.Integer">
Кроме того, возвращаемое значение методов слушателя ajax должно быть void
. Это полностью игнорируется в любом случае. Кроме того, имена методов должны начинаться со строчной буквы. См. Также Соглашения об именах Java .
Обновление в соответствии с комментарием, которое, похоже, не сработало в отношении проверки. Слушатель вызывается 2 раза, потому что по существу было отправлено 2 ajax-запроса, один для ввода и один для команды. Я предлагаю перенести метод слушателя на <h:commandButton action>
.
<f:ajax execute="addquantity" render="addquantity_message">
...
<h:commandButton action="#{listItems.AddQuantityAction}" />
<h:message id="addquantity_message" for="addquantity"/>
</f:ajax>
Вы только зафиксируете полученный идентификатор клиента как идентификатор ввода, а не идентификатор кнопки.