簡體   English   中英

Spring Validation - 用於解決字段錯誤的類級別驗證

[英]Spring Validation - Class level validation to address field errors

如果我們定義一個類級別的驗證注釋,例如比較字段並具有如下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()方法生成自定義約束違規。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM