Вы забыли дать вашему компоненту ввода id
.Именно на это должен указывать атрибут for
<h:message>
.
<h:inputText id="nameInput">
Не имеющий отношения к конкретной проблеме, ваш подход неуклюж и технически неверен.Согласно спецификации, вы должны бросить ValidatorException
.Поэтому вместо
((UIInput) validate).setValid(false);
context.addMessage(validate.getClientId(), msg);
do
throw new ValidatorException(msg);
Тогда JSF будет беспокоиться о том, чтобы установить компонент как недействительный и добавить сообщение в контекст.
Естьвторая проблема, вы проверяете локальное значение вместо переданного значения.
Замените
nameMatcher = textPattern.matcher(getName());
на
nameMatcher = textPattern.matcher(inputFromField);