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

如何在Java中利用Swagger(YAML文件)验证传入的REST请求?

嘿,刚好做过类似的需求,给你梳理一套在Java环境里用Swagger YAML校验REST请求的完整方案,亲测靠谱!

使用Swagger YAML在Java中校验REST请求的完整方案

一、核心依赖选择

我个人常用Atlassian开源的swagger-request-validator,它支持Swagger 2.0和OpenAPI 3.0,能和Spring MVC无缝集成,省心不少。

Maven依赖配置

<dependency>
    <groupId>com.atlassian.oai</groupId>
    <artifactId>swagger-request-validator-core</artifactId>
    <version>2.21.0</version>
</dependency>
<dependency>
    <groupId>com.atlassian.oai</groupId>
    <artifactId>swagger-request-validator-springmvc</artifactId>
    <version>2.21.0</version>
</dependency>

如果是Gradle项目,对应配置:

implementation 'com.atlassian.oai:swagger-request-validator-core:2.21.0'
implementation 'com.atlassian.oai:swagger-request-validator-springmvc:2.21.0'

二、编写Swagger YAML规范

先把你的API规则定义清楚,比如下面这个创建用户的示例,包含必填字段、格式、长度限制:

openapi: 3.0.1
info:
  title: 用户管理API
  version: 1.0.0
paths:
  /api/users:
    post:
      summary: 创建新用户
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                username:
                  type: string
                  minLength: 3
                  maxLength: 20
                email:
                  type: string
                  format: email
                age:
                  type: integer
                  minimum: 18
              required:
                - username
                - email

把这个文件放在src/main/resources下,命名为swagger.yaml即可。

三、集成校验到Spring项目

这里分两种方式:全局Filter自动校验,或者手动在Controller里校验,按需选择。

方式1:全局Filter自动校验(推荐)

配置一个Spring Bean,让所有请求都经过Swagger规则校验:

import com.atlassian.oai.validator.OpenApiInteractionValidator;
import com.atlassian.oai.validator.springmvc.OpenApiValidationFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerValidationConfig {

    @Bean
    public OpenApiValidationFilter openApiValidationFilter() {
        // 加载classpath下的swagger.yaml
        final OpenApiInteractionValidator validator = OpenApiInteractionValidator.createForSpecificationUrl("classpath:/swagger.yaml")
                .build();
        return new OpenApiValidationFilter(validator);
    }
}

这样所有匹配Swagger里定义的接口请求都会自动校验,不符合规则的会抛出ValidationFailedException。

方式2:手动在Controller中校验

如果只想给特定接口加校验,可以手动注入校验器,在接口方法里执行校验:

import com.atlassian.oai.validator.model.Request;
import com.atlassian.oai.validator.model.SimpleRequest;
import com.atlassian.oai.validator.OpenApiInteractionValidator;
import com.atlassian.oai.validator.ValidationErrors;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
public class UserController {

    private final OpenApiInteractionValidator validator;

    // 构造注入校验器(Spring会自动装配)
    public UserController(OpenApiInteractionValidator validator) {
        this.validator = validator;
    }

    @PostMapping("/api/users")
    public String createUser(@RequestBody String requestBody, HttpServletRequest httpRequest) {
        // 构建请求对象,适配校验器要求
        final Request request = SimpleRequest.Builder.post(httpRequest.getRequestURI())
                .withContentType("application/json")
                .withBody(requestBody)
                .build();

        // 执行校验
        final ValidationErrors errors = validator.validateRequest(request);

        if (!errors.isEmpty()) {
            // 这里可以抛出自定义异常,或者直接返回错误信息
            throw new IllegalArgumentException("请求参数不符合规范: " + errors.getSummary());
        }

        // 执行业务逻辑
        return "用户创建成功";
    }
}

四、自定义错误处理

为了让错误返回更友好,用@ControllerAdvice统一处理校验异常:

import com.atlassian.oai.validator.springmvc.ValidationFailedException;
import com.atlassian.oai.validator.ValidationErrors;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class ValidationExceptionHandler {

    @ExceptionHandler(ValidationFailedException.class)
    public ResponseEntity<String> handleValidationError(ValidationFailedException ex) {
        final ValidationErrors errors = ex.getValidationErrors();
        // 可以把所有错误信息拼接返回,或者封装成JSON格式
        return new ResponseEntity<>("请求校验失败:" + String.join("; ", errors.getAllMessages()), HttpStatus.BAD_REQUEST);
    }
}

一些注意事项

  • 确保Swagger YAML语法正确,可以用本地的Swagger Editor验证,避免语法错误导致校验器加载失败
  • 如果是Spring Boot 3.x,注意选择适配Jakarta EE的依赖版本(目前2.21.0已经支持)
  • 可以扩展校验规则,比如自定义格式校验,只需要实现CustomValidator接口并注册到校验器即可
  • 如果你的API用的是Swagger 2.0(不是OpenAPI 3.0),只需要把YAML里的openapi字段改成swagger: 2.0就行,校验器会自动识别

内容的提问来源于stack exchange,提问作者Kusum Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:52:09