我已经创建了一个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。如果我在字段上放置自定义注释,它将按预期工作。
答案 0 :(得分:1)
ElementType.PARAMETER
。
2.1 Constraint annotation
...
约束注释可以针对以下
ElementType
中的任何一个:
FIELD
用于约束属性- 对于受限制的bean,
METHOD
用于约束的getterTYPE
ANNOTATION_TYPE
用于构成其他约束的约束虽然不禁止其他
ElementType
,但提供者不必识别和处理对此类型的约束。内置类型支持PARAMETER
和CONSTRUCTOR
以允许Bean Validation提供程序特定的扩展。对于自定义注释,遵循相同的方法被认为是一种好习惯。
您必须将约束注释放在属性上(由ElementType.FIELD
标识)或放在getter上(由ElementType.METHOD
标识)。请注意,不支持受约束的setter!