Cross field validation with Hibernate Validator (JSR 303)

前端 未结 15 2041
渐次进展
渐次进展 2020-11-22 02:37

Is there an implementation of (or third-party implementation for) cross field validation in Hibernate Validator 4.x? If not, what is the cleanest way to implement a cross fi

15条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 02:46

    I like the idea from Jakub Jirutka to use Spring Expression Language. If you don't want to add another library/dependency (assuming that you already use Spring), here is a simplified implementation of his idea.

    The constraint:

    @Constraint(validatedBy=ExpressionAssertValidator.class)
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ExpressionAssert {
        String message() default "expression must evaluate to true";
        Class[] groups() default {};
        Class[] payload() default {};
        String value();
    }
    

    The validator:

    public class ExpressionAssertValidator implements ConstraintValidator {
        private Expression exp;
    
        public void initialize(ExpressionAssert annotation) {
            ExpressionParser parser = new SpelExpressionParser();
            exp = parser.parseExpression(annotation.value());
        }
    
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            return exp.getValue(value, Boolean.class);
        }
    }
    

    Apply like this:

    @ExpressionAssert(value="pass == passVerify", message="passwords must be same")
    public class MyBean {
        @Size(min=6, max=50)
        private String pass;
        private String passVerify;
    }
    

提交回复
热议问题