升级 SpringBoot 2.6.x 版本后,Swagger 没法用了

最近想体验下最新版本的 SpringBoot,逛了下官网,发现 SpringBoot 目前最新版本已经是 2.6.4 了,版本更新确实够快的。之前的项目升级了 2.6.4 版本后发现有好多坑,不仅有循环依赖的问题,连 Swagger 都没法用了!今天给大家分享下升级过程,填一填这些坑!

一、聊聊 SpringBoot 版本

首先我们来聊聊 SpringBoot 的版本,目前最新版本是 2.6.4 版本,2.7.x 即将发布,2.4.x 及以下版本已经停止维护了,目前的主流版本应该是 2.5.x2.6.x 。具体可以看下下面这张表。
在这里插入图片描述

二、开发中的坑

来找一个 SpringCloud 项目。

添加依赖
首先在 pom.xml 中修改 SpringBoot 的版本号,注意从 2.4.x 版本开始,SpringBoot 就不再使用 .RELEASE 后缀了。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

循环依赖

  • 启动项目后,由于 SpringBoot 禁止了循环引用,我们来看第一个报错,securityConfig 和 umsAdminServiceImpl 循环引用了,具体日志如下:
    在这里插入图片描述

  • 具体来说就是我们的 SecurityConfig 引用了 UmsAdminService;
    在这里插入图片描述

  • 而 UmsAdminServiceImpl 又引用了 PasswordEncoder;
    在这里插入图片描述

  • 由于 SecurityConfig 继承了 WebSecurityConfigurerAdapter,而 Adapter 又引用了 PasswordEncoder,这样就导致了循环引用。
    在这里插入图片描述

  • 要解决这个问题其实很简单,你可以修改 application.yml 直接允许循环引用,不过这个方法有点粗暴,在没有其他方法的时候可以使用;

spring:
  main:
    allow-circular-references: true
  • 其实循环引用主要是因为会导致 Spring 不知道该先创建哪个 Bean 才会被禁用的,我们可以使用 @Lazy 注解指定某个 Bean 进行懒加载就可以优雅解决该问题,比如在 SecurityConfig 中懒加载 UmsAdminService。
    在这里插入图片描述
    启动出错

  • 再次启动 SpringBoot 应用后会出现一个空指针异常,一看就是 Swagger 问题,原来挺好用的 Swagger 不能用了!
    在这里插入图片描述

  • Swagger 的配置类中添加如下 Bean 可以解决该问题;

/**
 * Swagger2API文档的配置
 */
@Configuration
public class Swagger2Config {

    @Bean
    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
        return new BeanPostProcessor() {

            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
                }
                return bean;
            }

            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
                List<T> copy = mappings.stream()
                        .filter(mapping -> mapping.getPatternParser() == null)
                        .collect(Collectors.toList());
                mappings.clear();
                mappings.addAll(copy);
            }

            @SuppressWarnings("unchecked")
            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
                try {
                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                    field.setAccessible(true);
                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            }
        };
    }

}

文档无法显示

  • 再次启动后访问 Swagger 文档,会发现之前好好的文档也无法显示了,访问地址: http://localhost:8088/swagger-ui/
    在这里插入图片描述
  • 修改 application.yml 文件,MVC 默认的路径匹配策略为 PATH_PATTERN_PARSER,需要修改为 ANT_PATH_MATCHER
spring:
  mvc:
    pathmatch:
      matching-strategy: ANT_PATH_MATCHER
  • 再次启动后发现 Swagger 已经可以正常使用了!

在这里插入图片描述

三、聊聊 Springfox

提到 Swagger,我们一般在 SpringBoot 中集成的都是 springfox 给我们提供的工具库,看了下官网,该项目已经快两年没有发布新版本了。

在这里插入图片描述
再看下 Maven 仓库中的版本,依旧停留在之前的 3.0.0 版本。如果 springfox 再不出新版本的话,估计随着 SpringBoot 版本的更新,兼容性会越来越差的!

参考地址:https://github.com/springfox/springfox

<think>嗯,用户想在SpringBoot 2.6.x及以上版本配置Swagger,并且遇到兼容性问题。首先,我需要回忆一下SwaggerSpringBoot中的使用情况。通常,我们会用Springfox Swagger,但SpringBoot 2.6.x之后可能有些变化。比如路径匹配策略的改变,可能导致Swagger的端点被拦截。 根据引用内容,升级2.6.x后,Swagger无法使用的问题可能与路径匹配有关。引用[1]提到需要更改默认的匹配策略,可能需要设置spring.mvc.pathmatch.matching-strategy为ANT_PATH_MATCHER。这点很重要,因为Spring Boot 2.6默认使用的是PathPatternParser,而Swagger可能还没适配这个变化。 然后,配置Swagger本身。用户需要添加Swagger的依赖,可能还是springfox-boot-starter,但版本可能需要升级。或者是否有其他替代库,比如SpringDoc?不过用户明确提到Swagger,可能还是指Springfox。 接下来,创建配置类,使用@EnableSwagger2注解。配置Docket Bean时,需要设置ApiInfo,包括标题、描述等信息。扫描的包路径需要正确,确保能扫描到Controller类。此外,处理HandlerMethod的BeanPostProcessor问题,可能需要排除某些类的处理,避免冲突。 可能还需要解决循环依赖的问题,但用户的问题主要在于配置Swagger,所以重点在Swagger配置和路径匹配上。代码示例中需要包含这些关键点:设置匹配策略、配置Docket、定义ApiInfo,以及可能的排除处理。 还要注意版本兼容性,确保使用的Springfox Swagger版本支持Spring Boot 2.6.x。可能需要使用较新的版本,比如2.10.5或更高,或者查看官方文档是否有特别说明。 最后,验证配置是否正确,访问/swagger-ui.html是否能正常显示,接口是否被正确扫描到。如果还有问题,可能需要检查日志,查看是否有路径匹配错误或Bean创建异常。</think>### Spring Boot 2.6.x 集成 Swagger 完整配置指南 #### 一、问题背景 Spring Boot 2.6.x 默认使用 `PathPatternParser` 路径匹配策略,而旧版 Swagger 的静态资源路径与新版策略存在兼容性问题,导致无法访问 `/swagger-ui.html`[^1][^4]。 #### 二、配置步骤(Java 代码实现) 1. **添加依赖(pom.xml)** ```xml <!-- 必须使用 3.0.0 以上版本 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> ``` 2. **修改路径匹配策略(application.yml)** ```yaml spring: mvc: pathmatch: matching-strategy: ant_path_matcher # 关键配置[^1] ``` 3. **创建 Swagger 配置类** ```java @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.example.controller")) // 扫描路径 .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("API 文档") .description("Spring Boot 2.6.x 接口文档") .version("1.0") .contact(new Contact("开发者", "", "contact@example.com")) .build(); } } ``` 4. **解决 BeanPostProcessor 冲突** ```java @SpringBootApplication @EnableSwagger2 public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class) .web(WebApplicationType.SERVLET) .properties("spring.main.allow-bean-definition-overriding=true") # 允许Bean覆盖 .run(args); } } ``` #### 三、验证配置 1. 访问 `http://localhost:8080/swagger-ui/` 2. 检查接口是否正常展示 #### 四、常见问题解决 1. **404 错误**:检查路径匹配策略是否设置为 `ant_path_matcher` 2. **空文档**:确认扫描路径包含 Controller 类 3. **启动报错**:添加 `spring.main.allow-bean-definition-overriding=true`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支帆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值