Чтобы ответить на ваш конкретный вопрос, вы можете использовать <f:attribute>
, заключенный в тот же компонент.
<h:inputText>
<f:validator validatorId="validateEmail" />
<f:attribute name="foo" value="bar" />
</h:inputText>
Внутри метода validate()
он доступен по UIComponent#getAttributes()
2-го UIComponent
аргумента.
String foo = component.getAttributes().get("foo"); // bar
Однако лучшее решение в вашем конкретном случае - просто разрешить валидатору return
, когда значение равно нулю или пусто.
if (email == null || email.isEmpty()) {
return;
}
В JSF 1.x в этом нет необходимости, потому что валидаторы не будут вызываться, когда ввод пуст или пуст. Но в JSF 2.x это изменилось, чтобы поддержать проверку бина JSR303. Поэтому, если вы хотите пропустить проверку пустых полей, вам нужно будет проверить это в каждом JSF Validator
.
Обратите внимание, что когда у вас есть это в вашем web.xml
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
тогда вы можете спокойно пропустить часть email.isEmpty()
из проверки, потому что она всегда будет null
вместо пустой строки.
Не имеет отношения к конкретной проблеме, шаблон которой у вас там устарел. В эти дни символы юникода разрешены в адресах электронной почты.
private static final String EMAIL_REGEXP = "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)";
(обратите внимание, что ^
и $
не нужны, потому что Pattern
уже неявно использует это)
Далее я также предлагаю сделать Pattern#compile()
непосредственно для переменной static final
. Компиляция шаблона является относительно дорогой, и экземпляр Pattern
в любом случае безопасен для потоков.
private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEXP);