Spring 验证 - Class 级验证以解决字段错误
Spring Validation - Class level validation to address field errors
如果我们定义一个 class 级别的验证注释,例如比较字段并具有 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()
方法生成自定义约束冲突。
如果我们定义一个 class 级别的验证注释,例如比较字段并具有 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()
方法生成自定义约束冲突。