Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring引导升级导致无法解决的循环引用_Spring Boot - Fatal编程技术网

Spring boot Spring引导升级导致无法解决的循环引用

Spring boot Spring引导升级导致无法解决的循环引用,spring-boot,Spring Boot,我将我的SpringBoot 1.3.5升级到1.5.2版本,当我的bean被连接时,突然出现了一个错误。我没有在任何地方进行构造函数注入,因此循环引用毫无意义 这是我的主要课程: @EnableGlobalMethodSecurity(securedEnabled = true) @SpringBootApplication public class MyApplication extends WebMvcConfigurerAdapter { ... } 我在/src/java/./

我将我的SpringBoot 1.3.5升级到1.5.2版本,当我的bean被连接时,突然出现了一个错误。我没有在任何地方进行构造函数注入,因此循环引用毫无意义

这是我的主要课程:

@EnableGlobalMethodSecurity(securedEnabled = true)
@SpringBootApplication
public class MyApplication extends WebMvcConfigurerAdapter  {
  ...
}
我在/src/java/./Configuration/中有许多@Configuration类,例如

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Bean
    public PasswordEncoder passwordEncoder() {
        // default strength = 10
        return new BCryptPasswordEncoder();
    }
...
}

我还有一个CustomUserDetails服务,它确实使用passwordEncoder,但在此之前从未出现过问题:

@Component
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private PasswordResetTokenRepository passwordTokenRepository;
...
}
然后我使用Spock通过扩展

@ContextConfiguration(classes = MyApplication, initializers = ConfigFileApplicationContextInitializer.class)
@WebAppConfiguration
@SpringBootTest
public class BaseSpecification extends Specification {

def setup() {
    RestAssured.port = serverPort;
}

@Value('${local.server.port}')
private int serverPort;
}
因此,所有这些都适用于Spring Boot 1.3.5,但现在我升级了,在构建或运行测试时,我得到了以下结果:

原因: org.springframework.beans.factory.unsatifiedDependencyException: 创建名为“customUserDetailsService”的bean时出错:不满意 通过字段“passwordEncoder”表示的依赖关系;嵌套异常 是org.springframework.beans.factory.beancurrentlyIncrementationException: 创建名为“passwordEncoder”的bean时出错:请求的bean为 当前正在创建:是否存在无法解析的循环引用? ... 原因: org.springframework.beans.factory.beancurrentlyIncrementationException: 创建名为“passwordEncoder”的bean时出错:请求的bean为 当前正在创建:是否存在无法解析的循环引用

更新 根据安迪的评论,我移动了一些依赖项,并认为我已经修复了它

  • 已将其从WebSecurity配置中删除,并将其置于MyApplicationConfiguration中:

    @自动连线 私有CustomUserDetails服务CustomUserDetails服务

    @自动连线 public void configureGlobal(AuthenticationManagerBuilder auth)引发异常{auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder()); 返回; }

    @豆子 公共密码编码器PasswordEncoder(){ //默认强度=10 返回新的BCryptPasswordEncoder(); }


  • 虽然我没有任何构造函数注入,但新的Spring安全性似乎做得不同。我无法确认,但这不再是一个问题。

    您的
    WebSecurityConfig
    似乎创建了一个循环。你能分享你的
    customuserdetails服务吗?它似乎依赖于由
    WebSecurityConfig
    创建的
    PasswordEncoder
    bean,同时也是
    WebSecurityConfig
    的一个依赖项。Andy,正如你提到的,我确实有一个依赖项。然而,这在两年内从未引起过问题,那么为什么升级会影响到这一点呢?像这样的周期通常靠运气而不是设计。它是SpringBoot1.3和1.5中SpringSecurity的一个不同版本,这可能会导致您的运气不好。因此,如果我不使用构造函数注入,我如何避免依赖性问题?我将我的spring security升级到了4.2.3.BUILD-SNAPSHOT,但我认为这并不能解决这个问题。我认为,多亏了您的初步评论,我发现了这个问题。我用我的工作更新了原来的帖子,如果你能回答我的评论,我接受。
    @ContextConfiguration(classes = MyApplication, initializers = ConfigFileApplicationContextInitializer.class)
    @WebAppConfiguration
    @SpringBootTest
    public class BaseSpecification extends Specification {
    
    def setup() {
        RestAssured.port = serverPort;
    }
    
    @Value('${local.server.port}')
    private int serverPort;
    }