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

在YMall商城项目中配置Swagger2接口文档时,遇到访问路径404的问题。原因是通用的页面跳转Controller与Swagger2默认路径冲突。通过修改web.xml,将/swagger-ui.html和/swagger-resources路径分别设置为Tomcat默认Servlet处理,解决了Swagger2资源无法访问的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题


在做 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 {

    @Autowired
    private ApiResourceController apiResourceController;

    /**
     * swagger-resources 跳转
     *
     * @return
     */
    @GetMapping("/swagger-resources")
    public ResponseEntity<List<SwaggerResource>> swaggerResources() {
        return apiResourceController.swaggerResources();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值