我将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的CustomUserDetailsService,但它以前从未出现过问题:
@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: 创建名称为' customUserDetailsService':不满意的bean时出错 通过字段表示的依赖关系' passwordEncoder&#39 ;;嵌套异常 是org.springframework.beans.factory.BeanCurrentlyInCreationException: 创建名称为' passwordEncoder':请求bean的bean时出错 目前正在创作:是否存在无法解析的循环引用? ...引起: org.springframework.beans.factory.BeanCurrentlyInCreationException: 创建名称为' passwordEncoder':请求bean的bean时出错 目前正在创作:是否存在无法解决的循环引用?
更新 根据Andy的评论,我移动了一些依赖关系并认为我已经修复了它。
从WebSecurityConfig中删除它并将它们放在MyApplicationConfiguration中:
@Autowired private CustomUserDetailsService customUserDetailsService;
@Autowired public void configureGlobal(AuthenticationManagerBuilder auth)抛出异常{auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder()); 返回; }
@Bean public PasswordEncoder passwordEncoder(){ //默认强度= 10 返回新的BCryptPasswordEncoder(); }
虽然我没有任何构造函数注入,但似乎新的Spring Security以不同的方式执行它。我无法确认,但这不再是一个问题。