如何在JSF 2.2中使用方法参数级别验证?

时间:2013-11-30 21:11:25

标签: jsf bean-validation jsf-2.2 java-ee-7

我已经创建了一个bean验证器,我将其应用于我的bean setter方法。我没有得到JSF验证错误,而是引发了异常。有没有办法让这个工作,或者我应该使用传统的JSF验证器?

//Bean Method
public void setGuestPrimaryEmail(@ValidEmail String email){
   guest.getEmails().get(0).setValue(email);
}

//Validator interface
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailValidator.class)
public @interface ValidEmail {

    String message() default "{invalid}";

    Class<? extends Payload>[] payload() default {};

    Class<?>[] groups() default {};

}

//Validator impl
public class EmailValidator implements ConstraintValidator<ValidEmail, String> {

    private Pattern p;

    @Override
    public void initialize(ValidEmail constraintAnnotation) {
        p = java.util.regex.Pattern
                .compile("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (DothatUtils.isEmpty(value)) {
            return true;
        }

        boolean invalid = !p.matcher(value).matches();
        if (invalid)
            return false;

        return true;
    }

}

例外:

2013-11-30T20:58:41.747+0000|SEVERE: javax.faces.component.UpdateModelException: 
javax.el.ELException: /index.xhtml @144,86 value="....": 
javax.validation.ConstraintViolationException: 1 constraint violation(s) occurred during method validation.

注意:我正在使用GF4和JSF 2.2.4。如果我在字段上放置自定义注释,它将按预期工作。

1 个答案:

答案 0 :(得分:1)

默认的JSR303 bean验证提供程序无法识别

ElementType.PARAMETER

来自JSR303 1.0 specification

  

2.1 Constraint annotation

     

...

     

约束注释可以针对以下ElementType中的任何一个:

     
      
  • FIELD用于约束属性
  •   
  • METHOD用于约束的getter
  •   对于受限制的bean,
  • TYPE
  •   
  • ANNOTATION_TYPE用于构成其他约束的约束
  •   
     

虽然不禁止其他ElementType,但提供者不必识别和处理对此类型的约束。内置类型支持PARAMETERCONSTRUCTOR以允许Bean Validation提供程序特定的扩展。对于自定义注释,遵循相同的方法被认为是一种好习惯。

您必须将约束注释放在属性上(由ElementType.FIELD标识)或放在getter上(由ElementType.METHOD标识)。请注意,不支持受约束的setter!