【问题标题】:Spring Validation - Class level validation to address field errorsSpring Validation - 类级别验证以解决字段错误
【发布时间】:2017-10-26 15:06:59
【问题描述】:

如果我们定义一个类级别的验证注解,例如一个比较字段并且有一个ConstraintValidator 这样的注解:

public class ComparisonValidator implements ConstraintValidator<ValueMatches, Object>
{
    private String[] fields;

    @Override
    public void initialize(final ValueMatches constraintAnnotation) {
        fields = constraintAnnotation.fields();
    }

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext context) {
        if (fields.length == 0) {
            return true;
        }

        final BeanWrapperImpl beanWrapper = new BeanWrapperImpl(value);
        final Object comparisonValue = beanWrapper.getPropertyValue(fields[0]);

        for (int i = 1; i < fields.length; i++) {
            final Object fieldValue = beanWrapper.getPropertyValue(fields[i]);

            if (!comparisonValue.equals(fieldValue)) {
                return false;
            }
        }

        return true;
    }
}

我们很好地产生了一个全局验证错误,可以通过 Thymeleaf 使用: ${#fields.errors('global')}

现在,我如何识别该错误并理解它是具体的比较错误?我的意思是,毕竟我们会收到有关全局错误的消息,还是我错了?

【问题讨论】:

    标签: java spring validation spring-validator


    【解决方案1】:

    该死的,Spring 文档! 这很简单,但不是很容易理解。

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext context) {
        if (fields.length > 0) {
            final BeanWrapperImpl beanWrapper = new BeanWrapperImpl(value);
            final Object comparisonValue = beanWrapper.getPropertyValue(fields[0]);
    
            for (int i = 1; i < fields.length; i++) {
                if (!comparisonValue.equals(beanWrapper.getPropertyValue(fields[i]))) {
                    context.disableDefaultConstraintViolation();
                    context.buildConstraintViolationWithTemplate(errorMessage).addPropertyNode(fields[0]).addConstraintViolation();
                    return false;
                }
            }
        }
    
        return true;
    }
    

    disableDefaultConstraintViolation() 方法告诉ConstrainValidatorContext 通过使用注解本身不要产生约束冲突对象。

    然后您可以通过buildConstraintViolationWithTemplate() 方法生成自定义约束违规。

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2010-12-25
      • 1970-01-01
      相关资源
      最近更新 更多