java - Spring Validation - 用于解决字段错误的类级别验证

标签 java spring validation spring-validator

如果我们定义一个类级别的验证注释,例如比较字段并有一个 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')}

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

最佳答案

该死的,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() 方法生成自定义约束冲突。

关于java - Spring Validation - 用于解决字段错误的类级别验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46957854/

相关文章:

java - 属性引用异常 : No property ids found for type

Spring 安全 : JWT token for API and session for web

c# - 隐藏 WPF DataGrid 行错误

java - 使用 smsj api 发送 EMS 消息

java - 在 android 中读取 XML 响应

java - Spring @Autowired EntityManager 失败

validation - 如何在 Joomla 3 注册中禁用某些字段的验证

java - 如何使用 neo4j/Java 查找特定节点

java.io.FileNotFoundException :/storage/emulated/0/New file. txt:打开失败:EACCES(权限被拒绝)

ruby-on-rails - 将模型属性限制为 Rails 中的值列表的方法是什么?