Spring Boot升级导致无法解析的循环引用

时间:2017-03-17 18:46:47

标签: spring-boot

我将SpringBoot 1.3.5升级到1.5.2 RELEASE,当我的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();
    }
...
}

@Configuration
@ComponentScan()
public class MyApplicationConfiguration {
@Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
        return new SessionTimeoutEmbeddedServletContainerCustomizer();
    }
...
}

我还有一个确实使用passwordEncoder的CustomUserDetailsS​​ervice,但它以前从未出现过问题:

@Component
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private PasswordResetTokenRepository passwordTokenRepository;
...
}

然后我通过扩展

将Spock用于我的IntegrationTests
@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.UnsatisfiedDependencyException:   创建名称为' customUserDetailsS​​ervice':不满意的bean时出错   通过字段表示的依赖关系' passwordEncoder&#39 ;;嵌套异常   是org.springframework.beans.factory.BeanCurrentlyInCreationException:   创建名称为' passwordEncoder':请求bean的bean时出错   目前正在创作:是否存在无法解析的循环引用?   ...引起:   org.springframework.beans.factory.BeanCurrentlyInCreationException:   创建名称为' passwordEncoder':请求bean的bean时出错   目前正在创作:是否存在无法解决的循环引用?

更新 根据Andy的评论,我移动了一些依赖关系并认为我已经修复了它。

  1. 从WebSecurityConfig中删除它并将它们放在MyApplicationConfiguration中:

    @Autowired private CustomUserDetailsS​​ervice customUserDetailsS​​ervice;

    @Autowired public void configureGlobal(AuthenticationManagerBuilder auth)抛出异常{auth.userDetailsS​​ervice(customUserDetailsS​​ervice).passwordEncoder(passwordEncoder());  返回; }

    @Bean public PasswordEncoder passwordEncoder(){     //默认强度= 10    返回新的BCryptPasswordEncoder(); }

  2. 虽然我没有任何构造函数注入,但似乎新的Spring Security以不同的方式执行它。我无法确认,但这不再是一个问题。

0 个答案:

没有答案