如何基于swagger.yaml配置实现Java端输入字段的自动校验
基于Swagger/OpenAPI规范生成Java校验逻辑的实现方案
完全可以实现,目前主流的OpenAPI工具链已经支持直接从yaml规范生成带JSR-380(Bean Validation 2.0)校验注解的Java模型类,无需手动编写校验逻辑,主流实现方案有两种:
方案1:使用OpenAPI Generator生成带校验的POJO
这是工业界最常用的落地方案,OpenAPI Generator支持读取OpenAPI 3.x/Swagger 2.x的yaml配置,自动将字段的length、pattern、minimum、required等约束转换成对应的@Size、@Pattern、@Min、@NotNull等Bean Validation注解。
- Maven项目可以直接通过插件集成,配置示例如下:
<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>7.6.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <inputSpec>${project.basedir}/src/main/resources/swagger.yaml</inputSpec> <generatorName>spring</generatorName> <configOptions> <!-- 开启Bean Validation注解生成开关 --> <useBeanValidation>true</useBeanValidation> <!-- 可选:配合lombok生成无冗余代码的POJO --> <lombok>true</lombok> </configOptions> </configuration> </execution> </executions> </plugin> - 实际生成效果:如果swagger.yaml中有如下字段定义
自动生成的POJO字段会自带校验注解:username: type: string minLength: 5 maxLength: 20 pattern: "^[a-zA-Z0-9_]+$" required: true
后续只需在Controller的请求参数上添加@NotNull @Size(min = 5, max = 20) @Pattern(regexp = "^[a-zA-Z0-9_]+$") private String username;@Valid注解,Spring框架就会自动完成参数校验,不符合规范直接返回参数错误响应。
方案2:运行时动态校验(无需生成代码)
如果不希望在项目中引入代码生成步骤,也可以使用Swagger Request Validator类工具,在请求到达Controller之前直接读取swagger.yaml的规范完成动态校验:
- 引入对应依赖后,只需将校验器绑定到项目的swagger.yaml文件,所有入参都会自动和规范做对比,不符合要求直接返回校验错误
- 适合轻量项目使用,缺点是性能略低于静态注解校验,错误提示的自定义灵活度也稍差
注意:两种方案都要求swagger.yaml中的字段约束配置完整、符合OpenAPI官方规范,否则生成的校验逻辑会和预期不一致。
内容的提问来源于stack exchange,提问作者Prodox21
相关产品推荐
相关产品推荐

