我正在尝试将JHipster Spring Boot应用程序从版本v1.3.6迁移到最新的Spring Boot v1.4.1。但是,当我尝试运行应用程序时,我现在收到以下错误消息:
***************************
APPLICATION FAILED TO START
***************************
Description:
There is a circular dependency between 1 beans in the application context:
- loadSampleData (field private app.service.UserService app.sample.LoadSampleData.userService)
- userService
我很困惑,因为UserService类对LoadSampleData类没有任何依赖性。
错误消息表明只有1个bean之间存在循环依赖关系的事实也令人困惑,因为bean如何与自身有循环依赖关系?
如果有人知道这个问题的解决方案,或者显示有关循环依赖的原因的更具体信息的方法,我们将不胜感激。
如果它有帮助,这是LoadSampleData类:
@Component
@Profile(Constants.SPRING_PROFILE_DEVELOPMENT)
public class LoadSampleData {
private static final Logger log = LoggerFactory.getLogger(LoadSampleData.class);
@Inject
private UserService userService;
@PostConstruct
public void init() { ... }
}
答案 0 :(得分:1)
事实证明,UserService与我的项目中名为EventService的另一个类有循环依赖关系。通过从EventService中删除UserService依赖项,我能够让项目运行。
LoadSampleData类与EventService没有任何依赖关系,因此我不确定为什么错误描述说问题与LoadSampleData类有关。
要找到原因,我必须通过UserService并注释掉依赖项,直到我发现导致问题的那个。
答案 1 :(得分:1)
循环依赖的两种解决方案对我有用:
1) 使用@Lazy 注解
检查控制台上的错误并在所涉及的 bean 上使用 @Lazy 注释。例如:
<div v-if="commentIndex <= commentsToShow">
然而,这种解决方案并不是最好的,因为它可以被视为不优雅,也不一定能防止将来再次发生同样的错误。
2) 重新设计
我认为这是最好的解决方案,因为你真的解决了问题的根源。
就我而言,我注意到我的堆栈跟踪中的所有“原因”都指向我的 BCryptPasswordEncoder bean,例如:
<块引用>原因: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“userService”的 bean 时出错:依赖项不满足 通过字段“passwordEncoder”表示;嵌套异常是 org.springframework.beans.factory.BeanCurrentlyInCreationException: 创建名为“bCryptPasswordEncoder”的 bean 时出错:请求的 bean 当前正在创建:是否存在无法解析的循环引用?
然后我意识到我的 BCryptPasswordEncoder 是在我的 SecurityConfig 类中声明的,由于我的依赖关系的特殊安排,这导致了循环引用:
<div v-if="commentIndex > 0">
所以解决方案是创建另一个配置类来声明 bean:
@Service
public class AuthorizationService {
@Autowired
@Lazy
private EnrollmentService enrollmentService;