【问题标题】:How to cascade validation in a custom validator?如何在自定义验证器中级联验证?
【发布时间】:2021-12-30 10:05:43
【问题描述】:

在 Spring 项目 (4.3.14.RELEASE) 中,我需要在 MVC 层中验证 Map<String, List<InnerObj>> map

为此我编写了一个自定义验证器

public class MapValidator implements ConstraintValidator<ValidMap, Map<String, List<InnerObj>>> {

@Override
public boolean isValid(final Map<String, List<InnerObj>> map,
                       final ConstraintValidatorContext context) {
    if (map == null || map.size() == 0) {
        return false;
    }

    // iterations over all objects and validation

    return true;
}

和注释

@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = MapValidator.class)
public @interface ValidMap {
    String message() default "valid.map";

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

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

如何强制验证从我的验证器传播(类似于@Valid)到内部对象(ListInnerObj)?

【问题讨论】:

  • 是什么阻止您使用@Valid
  • @Valid 不适用于地图中的集合

标签: java spring validation


【解决方案1】:

原则上,您可以将 Spring 配置的 Validator 注入您的 MapValidator 并在列表元素上调用其 validate 方法。但是,您需要以某种方式将生成的 Set&lt;ConstraintViolation&lt;ISoftBetFRBCoinDTO&gt;&gt; 集成到 ConstraintValidatorContext 参数中。

这种方法似乎有点过头了。

实际上,Bean Validation 确实支持通过@Valid 为方法参数验证集合元素:

public void method(Map<String, List<@Valid Address>> addressMap) {

@Valid 的这种用法在 Bean 验证规范中称为 方法验证

只是为了在Spring中激活方法验证,你必须用Spring的@Validated注解来注解包含类:

@RestController
@Validated
public class HelloWorldController {
    
    @PostMapping("/hello")
    public Map<String, List<Address>> helloWorld(@RequestBody Map<String, List<@Valid Address>> addressMap) {
        return addressMap;
    }
}

From Spring documentation:

为了符合 Spring 驱动的方法验证的条件,所有目标类都需要使用 Spring 的 @Validated 注释进行注释,它还可以选择声明要使用的验证组。有关 Hibernate Validator 和 Bean Validation 1.1 提供程序的设置详细信息,请参阅 MethodValidationPostProcessor

另请参阅MethodValidationPostProcessor 的链接 javadoc。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多