Сегодня заметил неприятную фичу в имплементации MyFaces JSF: она не вызывает валидаторы на поле, если значение пустое.
Вот метод из UIInput, из-за которого происходит сия неприятность:
protected void validateValue(FacesContext context,Object convertedValue)
{
boolean empty = convertedValue == null ||
(convertedValue instanceof String
&& ((String)convertedValue).length() == 0);
if (isRequired() && empty)
{
_MessageUtils.addErrorMessage(context, this, REQUIRED_MESSAGE_ID,new Object[]{getId()});
setValid(false);
return;
}
if (!empty)
{
_ComponentUtils.callValidators(context, this, convertedValue);
}
}
Это значит, что нельзя использовать свой валидатор для определения - пустое поле или нет и нельзя добавить своё сообщение, если поле пустое. Свои валидаторы обрабатываются только в том случае, если поле не пустое. А если поле пустое, то оно может быть обработано только стандартным валидатором со стандартным дурным сообщением об ошибке - оно может очень хорошо напугать любого пользователя.
Единственный способ обойти этот глюк - всунуть кусок кода с проверкой и добавлением сообщения внутрь самого метода action/actionListener :(
