使用 spring 启动安全性的 Web 应用程序中的循环依赖

circular dependency in web application using spring boot security

循环依赖错误。由于我是这项技术的新手,所以我无法解决这个问题。我需要一些来解决这个问题。 此代码用于保护现有项目中的几个页面。我必须确保只有 3 页才能由管理员访问。任何可以避免循环依赖或可以完成我的任务的解决方案都会有所帮助。 我的任务是完成安全的几页访问用户。此代码取自 Whosebug 片段。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/editincident","editaccident","editreqeust").authenticated()
                .anyRequest().permitAll()
                .and()
                .csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
    }
}

在 spring.io 文档中有 “如果您主要使用构造函数注入,则可能会创建无法解决的循环依赖场景。

例如:Class A 通过构造函数注入需要一个 class B 的实例,而 class B 通过构造函数注入需要一个 class A 的实例。如果为 classes A 和 B 配置 beans 相互注入,Spring IoC 容器会在运行时检测到此循环引用,并抛出 BeanCurrentlyInCreationException。

一个可能的解决方案是编辑一些 class 的源代码,由 setter 而非构造函数配置。或者,避免构造函数注入并仅使用 setter 注入。也就是说,虽然不推荐,但是可以通过setter注入来配置循环依赖。"

因此您应该使用构造函数方法更改创建 bean 之一的方式

您可以在 application.properties 文件中写入一行来消除此错误。
spring.main.allow-circular-references= true