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

Mat*_*ndy 4 validation jsf-2

我有以下输入字段:

<h:inputText value=".." validator="#{labController.validateValue}"/>
Run Code Online (Sandbox Code Playgroud)

如果该字段为空,将不会验证(validateValuelabController不调用).

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

<h:inputText value=".." >
  <f:validator validatorId="labDateValidator"/>
</h:inputText>
Run Code Online (Sandbox Code Playgroud)

那么validate即使输入空字段也可以调用它的方法?

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

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

Bal*_*usC 6

你在JSF中受到了疏忽.该validator包装在MethodExpressionValidator其中根据它的源validate()方法确实跳过验证当该值null.

if (value != null) {
    try {
        ELContext elContext = context.getELContext();
        methodExpression.invoke(elContext, new Object[]{context, component, value});
        ...
Run Code Online (Sandbox Code Playgroud)

这不考虑javax.faces.VALIDATE_EMPTY_FIELDS默认的新JSF 2.0 上下文参数true.它实际上应该做同样的事情UIInput#validate().

if (!isEmpty(newValue) || validateEmptyFields(context)) {
    try {
        ELContext elContext = context.getELContext();
        methodExpression.invoke(elContext, new Object[]{context, component, value});
        ...
Run Code Online (Sandbox Code Playgroud)

这已被报道为Mojarra问题1508.我已经投了票,并添加了一条新评论来唤醒他们.