【问题标题】:Jersey/JAX-RS : How to cascade beans-validation recursively with @Valid automatically?Jersey/JAX-RS:如何使用 @Valid 自动递归地级联 bean-validation?
【发布时间】:2023-03-23 02:15:02
【问题描述】:

我正在泽西岛的 REST 资源端点中验证我的 POJO:

public class Resource {
    @POST
    public Response post(@NotNull @Valid final POJO pojo) {
        ...
    }
}

public class POJO {
    @NotNull
    protected final String name;

    @NotNull
    @Valid
    protected final POJOInner inner;

    ...
}

public class POJOInner {
    @Min(0)
    protected final int limit;

    ...
}

这似乎工作正常。

但是,只有当字段 inner 具有 @Valid 注释时,才会验证 @Min(0) 注释。将@Valid 注解添加到每个不是原语的字段感觉不对。

有没有办法告诉 bean 验证器自动递归地继续验证,即使没有 @Valid 注释存在?我希望我的POJO 如下:

public class POJO {
    @NotNull
    protected final String name;

    @NotNull
    protected final POJOInner inner;

    ...
}

【问题讨论】:

  • 你使用的是什么 bean 验证运行时?
  • 我正在使用 Hibernate 验证器。

标签: java jersey jax-rs bean-validation


【解决方案1】:

实际上,根据规范,添加@Valid 正是针对此用例的。来自 JSR 303 规范:

除了支持实例验证外,还支持对象图的验证。图验证的结果作为一组统一的约束违规返回。 考虑 bean X 包含 Y 类型字段的情况。通过使用 @Valid 注解来注解字段 Y,Validator 将在 X 被验证时验证 Y(及其属性)。

...

@Valid 注解是递归应用的

【讨论】:

  • Spring 默认不这样做。我使用的是 spring boot 2.0.0.BUILD-SNAPSHOT
  • 虽然这可能是真的,但它并没有解释是否可以在不需要注释所有成员的情况下实现递归验证,这是 OP 所要求的......
  • 解决这个 IMO 的方法是获取一个自定义验证器并添加一个 TraversableResolve,如 docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/… 中那样。如果它的意图是验证整个对象图,这将比使用 @Valid 注释混乱代码库要好。
  • “@Valid 注释是递归应用的”它似乎没有在休眠实现中...
猜你喜欢
  • 2016-08-20
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
相关资源
最近更新 更多