Spring 列表的 MVC 验证并报告无效值

Spring MVC Validation for list and reporting the invalid value

我有一个应该具有特定格式的字符串列表。我需要 return 带有未指定格式的字符串的错误消息。如何使用 spring 验证来做到这一点(我正在使用休眠验证器)。 注释:

@Documented
@Retention(RUNTIME)
@Target({FIELD, METHOD})
@Constraint(validatedBy = HostsValidator.class)
public @interface HostsConstraint {
    String message();

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

实施:

public class HostsValidator implements ConstraintValidator<HostsConstraint, List<String>>{

    @Override
    public void initialize(OriginHostsConstraint constraintAnnotation) {

    }

    @Override
    public boolean isValid(List<String> strings, ConstraintValidatorContext context) {
        for (String s : strings) {
            if (!s.matches("[0-9]+") {
                //How do I say: Invalid string <s> ?
                return false;
            }
        }

    }

}

用法:

public class Test {

    @HostsConstraint(message="Invalid string ")
    private List<String> hosts;

}

使用 validatedValue 将给出整个列表。

我想我找到了解决方案,但它与 hibernate 验证器相结合。甚至可能是一个 hacky 实现。

用法:

public class Test {

    @HostsConstraint(message="Invalid string : ${invalidStr}")
    private List<String> hosts;

}

实施

public class HostsValidator implements ConstraintValidator<HostsConstraint, List<String>>{

    @Override
    public void initialize(OriginHostsConstraint constraintAnnotation) {}

    @Override
    public boolean isValid(List<String> strings, ConstraintValidatorContext context) {
        for (String s : strings) {
            if (!s.matches("[0-9]+") {
                ConstraintValidatorContextImpl contextImpl =
                    (ConstraintValidatorContextImpl) context
                        .unwrap(HibernateConstraintValidatorContext.class);
                contextImpl.addExpressionVariable("invalidStr", s);
                return false;
            }
        }
    }
}

使用 JSR 380 验证,它允许容器元素约束。

这里是 link 到 Hibernate Validator 6.0.6.FINAL Document

中的容器元素部分