我有以下输入字段:
<h:inputText value=".." validator="#{labController.validateValue}"/>
如果该字段为空,则不会对其进行验证(validateValue
中的labController
未被调用)。
但是使用单独的验证器类:
<h:inputText value=".." >
<f:validator validatorId="labDateValidator"/>
</h:inputText>
然后即使输入空字段也可以调用它的validate
方法吗?
这是我观察到的。这种行为是否依赖于实现或版本(我使用的是Mojarra 2.1)?
背景是我想将自己的方法/类用于所有验证任务,包括必需的验证。它只适用于验证器类吗?
答案 0 :(得分:6)
你在JSF中受到了疏忽。 validator
包含在MethodExpressionValidator
中,根据validate()
方法的来源确实在值为null
时跳过验证。
if (value != null) {
try {
ELContext elContext = context.getELContext();
methodExpression.invoke(elContext, new Object[]{context, component, value});
...
这不考虑新的JSF 2.0 javax.faces.VALIDATE_EMPTY_FIELDS
上下文参数,默认为true
。它应该与UIInput#validate()
一样。
if (!isEmpty(newValue) || validateEmptyFields(context)) {
try {
ELContext elContext = context.getELContext();
methodExpression.invoke(elContext, new Object[]{context, component, value});
...
这已被报告为Mojarra issue 1508。我已经投了票并添加了一条新评论来唤醒他们。