升级到 Spring Boot 2.6 时 Spring Security 和 org.springdoc.ui.SwaggerConfig 之间的循环引用

Posted

技术标签:

【中文标题】升级到 Spring Boot 2.6 时 Spring Security 和 org.springdoc.ui.SwaggerConfig 之间的循环引用【英文标题】:circular reference between Spring Security and org.springdoc.ui.SwaggerConfig when upgrading to Spring Boot 2.6 【发布时间】:2022-01-17 22:41:47 【问题描述】:

将我的应用程序从 Spring Boot 2.5 升级到 2.6 时,我收到此错误:

创建名为“securityConfig”的 bean 时出错:依赖关系不满足 通过方法'setContentNegotationStrategy'参数0表示;

嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建具有名称的 bean 时出错 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration': 通过方法“setConfigurers”表达的不满足的依赖关系 参数0;

嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为 'org.springdoc.ui.SwaggerConfig' 的 bean 时出错: 通过字段表示的不满足的依赖关系 'swaggerIndexTransformer';

嵌套异常是 org.springframework.beans.factory.BeanCurrentlyInCreationException: 创建名为 'org.springdoc.ui.SwaggerConfig' 的 bean 时出错: 请求的 bean 当前正在创建中:是否存在无法解析的问题 循环引用?

此错误记录在https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes#circular-references-prohibited-by-default 上,我知道我可以通过设置属性来“修复”它并返回 Spring Boot 2.5 行为。但如果我可以借此机会修复循环引用,我可能会为未来做好。

我的securityConfig 很简单,因为我的应用程序是一个公共应用程序,它向所有调用者返回一些 html 内容,无需身份验证。所以这是我的配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 

  @Override
  protected void configure(HttpSecurity security) throws Exception 
    //application is open to everyone - no security
    security.httpBasic().disable();
  

错误提到的setContentNegotationStrategyWebSecurityConfigurerAdapter 中的一个方法,我没有覆盖它,所以我无法理解我需要做什么。

如果我删除了我的SecurityConfig 类,那么我仍然有一个错误,和以前一样,但没有提及我的SecurityConfig 类:

使用名称创建 bean 时出错 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration': 通过方法“setConfigurers”表达的不满足的依赖关系 参数0;

嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为 'org.springdoc.ui.SwaggerConfig' 的 bean 时出错: 通过字段表示的不满足的依赖关系 'swaggerIndexTransformer';

嵌套异常是 org.springframework.beans.factory.BeanCurrentlyInCreationException: 创建名为 'org.springdoc.ui.SwaggerConfig' 的 bean 时出错: 请求的 bean 当前正在创建中:是否存在无法解析的问题 循环引用?

处理 Spring Security 和 org.springdoc.ui.SwaggerConfig 之间似乎是循环引用的推荐方法是什么?

【问题讨论】:

【参考方案1】:

问题是由org.springdoc.ui.SwaggerConfig 引起的。已由these changes 修复,在springdocs-openapi 1.5.13 中可用。

【讨论】:

以上是关于升级到 Spring Boot 2.6 时 Spring Security 和 org.springdoc.ui.SwaggerConfig 之间的循环引用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.6 + 集成 - internalPublisherAnnotationBeanPostProcessor 循环依赖

Spring Cloud 2021.0.0 正式发布,第一个支持Spring Boot 2.6的版本!

滴滴将裁员15%涉及员工超2000人;Spring Boot 2.1.3 发布……

在升级到 Spring Boot 2.0 时,得到 UnsatisfiedDependencyException

升级到最新版本时 Spring Boot 国际化不起作用

将 Spring Boot 升级到 2.4.1