使用内联验证方法和验证器类验证空字段

时间:2012-02-23 14:34:27

标签: validation jsf-2

我有以下输入字段:

<h:inputText value=".." validator="#{labController.validateValue}"/>

如果该字段为空,则不会对其进行验证(validateValue中的labController未被调用)。

但是使用单独的验证器类:

<h:inputText value=".." >
  <f:validator validatorId="labDateValidator"/>
</h:inputText>

然后即使输入空字段也可以调用它的validate方法吗?

这是我观察到的。这种行为是否依赖于实现或版本(我使用的是Mojarra 2.1)?

背景是我想将自己的方法/类用于所有验证任务,包括必需的验证。它只适用于验证器类吗?

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。我已经投了票并添加了一条新评论来唤醒他们。

相关问题