首页 > 解决方案 > Swagger 记录了所有未在 Spring Boot Controller 类中映射的 HTTP 方法

问题描述

我正在使用 Swagger 3.0.0 来记录通过基于 Spring Boot 的应用程序生成的 HTTP API 端点。但是,当我将控制器方法映射到端点时,Swagger 创建了文档,其中将该控制器与所有可能的 HTTP 方法相关联(即使我明确将其编程为与单个 HTTP 方法相关联,比如 GET)。例如,考虑以下代码:

// Application.java

//required imports

@SpringBootApplication
@EnableSwagger2
public class Application {
    
    public static void main (String args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean 
    public Docket apiConfigurator () {
        // build the required Docket
    } 

}
// DataController.java

// required imports

@RestController

public class DataController {

    @ApiOperation(value = "Returns all the data")
    @RequestMapping("/data/allData")
    public String getAllData () {
        // return some data 
    }
}

现在,如果我要执行这样的操作,那么 Swagger 会自动将该getAllData ()方法映射到所有 HTTP 方法(GET、PUT、POST 等)。这是错误的,因为唯一getAllData ()应该关联的方法基本上是 GET 方法。

那么,我应该如何处理这个问题呢?

标签: javaspring-bootswagger-uispringfox

解决方案


我不知道具体情况,但直接使用@RequestMapping 注解将 GET 方法隐式映射到控制器方法会使 Swagger 感到困惑。这就是为什么在 Swagger 存在的情况下写下映射注释时需要具体的原因。我的意思是,你需要明确地告诉 Spring Boot(和 Swagger)这个控制器方法,比如getAllData ()映射到一个 HTTP 方法,比如 GET 使用:

  1. @RequestMapping (value = "/path/to/get/foobar", method = RequestMethod.GET)或者
  2. @GetMethod ("/path/to/get/foobar")

这样,基于 Swagger 的文档getAllData ()只与 GET 相关联,而没有其他任何东西。


推荐阅读