【发布时间】:2013-02-14 00:26:27
【问题描述】:
我正在尝试获取对我的存储库接口 (UserRepository) 的引用,该接口在我的自定义实现 (UserRepositoryExtensionImpl) 中扩展了 CrudRepository,以便访问 Spring JPA 提供的所有方法。
Crud 扩展:
@Repository
public interface UserRepository extends CrudRepository<User, String>, UserRepositoryExtension<RosterUser> {
...any custom spring JPA methods...
}
扩展接口:
@Repository
public interface UserRepositoryExtension <T> {
public T put(T entity);
}
自定义实现:
public class UserRepositoryExtensionImpl implements UserRepositoryExtension<User> {
UserRepository userRepository;
@Autowired
public UserRepositoryExtensionImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public User put(User user) {
System.out.println(user + "was put");
// ...put logic here
return null;
}...
}
但是,我无法注入UserRepository,因为存在循环依赖(假设UserRepository 扩展了我的UserRepositoryImpl 实现的接口)。我收到以下错误:
org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ' userRepositoryImpl': Requested bean is currently in creation: Is there an unresolvable circular reference?
一种可能但不太理想的解决方案是将EntityManager 注入UserRepositoryImp,但在这种情况下,我无法访问CrudRepository 提供的任何Spring JPA 方法,或任何其他方法我可能在 UserRepository 中创建的方法。
关于如何解决这个问题的任何建议?
任何帮助将不胜感激。
编辑:正如@shelley 的回答中提到的,我可以通过进行 3 处更改来解决这个问题:
- 从
UserRepositoryExtensionImpl中删除@Repository - 将
UserRepositoryExtensionImpl重命名为UserRepositoryImpl。显然,这使 Spring 意识到实现的存在。见Spring Doc - 删除我的构造函数并将
@Autowired移动到userRepository字段
成功!
【问题讨论】:
-
如果没有任何实际的循环依赖(即:Spring 只是感到困惑,因为它认为您有许多类似类型的 bean)。添加额外的限定符,例如 bean id,以便 Spring 知道要自动装配哪个 bean。
-
给我们你的 Spring 应用上下文
-
@gerrytan - 我可能是错的,但我确实认为存在循环依赖。仅供参考:同样的问题被引用here
标签: java spring hibernate spring-mvc spring-data-jpa