当前位置: 代码迷 >> 综合 >> 【BUG】Swagger2 与通用的 Spring MVC Controller 冲突
  详细解决方案

【BUG】Swagger2 与通用的 Spring MVC Controller 冲突

热度:9   发布时间:2023-11-19 16:07:47.0

问题


在做 YMall 商城项目时,配置了 Swagger2 接口文档,默认的访问路径时 http://localhost:8080/swagger2-ui.html,一直 404。

问题原因


Swagger2 默认的访问路径时 http://localhost:8080/swagger2-ui.html,但在因为我写了一个通用的页面跳转方法,如下:

/** * 通用的跳转方法 * * @param page * @return */
@GetMapping("{page}")
public String showPage(@PathVariable String page) {
    return page;
}

这时就出现了一个问题,访问 http://localhost:8080/swagger2-ui.html,就会通过这个 Controller,出现 404 错误。

于是我做了修改,再 web.xml 中配置了,如下代码:

<!-- Swagger2 配置 -->
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/swagger-ui.html</url-pattern>
</servlet-mapping>

让 /swagger-ui.html 由 Tomcat 默认的 Servlet 进行处理,这样就可以不经过 Controller,直接跳转 swagger2-ui.html 页面了。

当我以为问题这就解决了的时候,新的问题又出现了,/swagger-resources 这个路径的资源 404,原因也是因为通过了通用的 Controller。

我以为是跟前面同一个问题,在 web.xml 做了与之前的处理方式,发现 Tomcat 默认的 Servlet 也没有 /swagger-resources 这个路径映射,所以这个路径还是 404。

后来查看了 Swagger2 的源码,在 swagger-common 包中,有一个 ApiResourceController 就是 Swagger2 的路径映射 Controller,类中有 /swagger-resouces 路径的映射。

至于为什么这个类的的路径映射没有生效,可能是因为被我写的 Controller 给覆盖了。

解决方法


配置 web.xml,如下:

<!-- Swagger2 配置 -->
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/swagger-ui.html</url-pattern>
</servlet-mapping>

重写 /swagger2-resources 的路径映射,如下:

/*** @Classname SwaggerController* @Date 2019/5/20 19:32* @Created by Yuu*/
@RestController
public class SwaggerController {
    @Autowiredprivate ApiResourceController apiResourceController;/*** swagger-resources 跳转** @return*/@GetMapping("/swagger-resources")public ResponseEntity<List<SwaggerResource>> swaggerResources() {
    return apiResourceController.swaggerResources();}
}
  相关解决方案