You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

springdoc-openapi-ui中共享子DTO如何按父级设置不同长度约束

springdoc-openapi-ui 1.4.1共享子DTO不同嵌套场景的约束配置方案

你观察到的io.swagger.v3.core.jackson.ModelResolver默认逻辑是正确的:原生实现仅会读取子DTO本身的JSR-303注解生成Schema,不会感知属性被哪类上层DTO嵌套引用,因此无法直接通过子DTO加单个注解实现不同场景的差异化约束,你提到的需求可通过以下3种方案实现:

方案1:上层DTO字段加@Schema覆盖嵌套属性约束(最轻量方案)

直接在请求、响应类的子DTO字段上,通过@Schema的properties属性指定嵌套字段的约束,无需修改底层逻辑,完全适配1.4.1版本原生能力,代码示例如下:

// 校验分组定义(如果同时需要运行时参数校验可加,仅生成文档不需要)
public interface RequestGroup {}
public interface ResponseGroup {}

@Getter
@Setter
public class Request {
    // 覆盖嵌套的name属性最大长度为20
    @Schema(properties = {
        @SchemaProperty(name = "name", maxLength = 20)
    })
    // 运行时校验加此注解:@Valid @ConvertGroup(from = Default.class, to = RequestGroup.class)
    private NameContainer holder;
}

@Getter
@Setter
public class Response {
    // 覆盖嵌套的name属性最大长度为50
    @Schema(properties = {
        @SchemaProperty(name = "name", maxLength = 50)
    })
    private NameContainer holder;
}

@Getter
@Setter
public class NameContainer {
   // 如果需要运行时参数校验,加分组校验注解,仅生成文档不需要加
   // @Size(max = 20, groups = RequestGroup.class)
   // @Size(max = 50, groups = ResponseGroup.class)
   private String name;
}

方案2:自定义ModelResolver实现路径感知约束(适合多复用场景)

如果大量子DTO需要类似的差异化约束,不想每个上层字段都加注解,可以扩展默认的ModelResolver:

  • 继承io.swagger.v3.core.jackson.ModelResolver类
  • 重写属性解析逻辑,新增嵌套属性的所属类路径上下文跟踪
  • 匹配到预设的路径规则(如Request.holder.name、Response.holder.name)时,写入对应的约束值到Schema
  • 将自定义ModelResolver注册为Spring Bean,设置优先级高于默认实现即可生效

方案3:结合JSR-303分组校验同步文档和运行时约束

如果需要文档约束和接口运行时参数校验逻辑完全一致,可以用分组校验配合自定义OpenAPI后置处理器:

  • 定义不同场景的校验分组接口
  • 在子DTO字段上加对应分组的JSR-303校验注解
  • 自定义OpenAPI构建处理器,识别请求/响应对应的校验分组,将对应分组的约束值写入生成的Schema中

内容的提问来源于stack exchange,提问作者Nikita Glukhov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:39:03