Spring ConstraintValidator定制

时间:2019-05-07 07:32:09

标签: java spring-boot spring-validator

在问问题之前,我很抱歉英语不好。

我正在实现自定义ConstraintValidator来进行跨字段验证,如下所示。

验证目标类别

public class ValidationTarget {
    @Valid
    private Inner inner;

    @ValidDates(fromField = "from", toField = "to",
                message = "{from} must not be later than {to}")
    public class Inner {
        private Date from;
        private Date to;
    }

    // ...
}

CustomConstraintValidator

// imports ...

public class CustomConstraintValidator implements ConstraintValidator<ValidDates, Object> {

    private String fromFieldName;
    private String toFieldName;
    private String message;

    @Override
    public void initialize(ValidDatesvalidationSpec) {
        this.fromFieldName = validationSpec.fromField();
        this.toFieldName = validationSpec.toField();
        this.message = validationSpec.message();
    }

    @Override
    public boolean isValid(Object target, ConstraintValidatorContext ctx) {
        Date startDateObject = getFieldValue(target, fromFieldName);
        Date endDateObject = getFieldValue(target, toFieldName);

        if (start.after(end)) {
            addConstraintViolation(toFieldName, message, ctx);
            return false;
        }

        return true;
    }

    private void addConstraintViolation(String propertyName, String message, ConstraintValidatorContext ctx) {
        ctx.buildConstraintViolationWithTemplate(message)
           .addPropertyNode(propertyName)
           .addConstraintViolation()
           .disableDefaultConstraintViolation();
    }

    private Date getFieldValue(Object instance, String fieldName) {
        Field field = ReflectionUtils.findField(instance.getClass(), fieldName);
        ReflectionUtils.makeAccessible(field);
        return (Date) ReflectionUtils.getField(field, instance);
    }

}

在上面的代码中,调用Inner中的getInvalidValue()时将返回ConstraintViolation类对象。

我只想将此值更改为特定字段值,而不是整个Inner类。

0 个答案:

没有答案