我正在尝试获取对我的存储库接口(interface) (UserRepository
) 的引用,该接口(interface)按顺序在我的自定义实现 (UserRepositoryExtensionImpl
) 中扩展了 CrudRepository
访问 Spring JPA 提供的所有方法。
Crud 扩展:
@Repository
public interface UserRepository extends CrudRepository<User, String>, UserRepositoryExtension<RosterUser> {
...any custom spring JPA methods...
}
扩展接口(interface):
@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;
}...
}
但是,我无法注入(inject) UserRepository
,因为存在循环依赖项(假设 UserRepository
扩展了我的 UserRepositoryImpl
实现的接口(interface))。我收到以下错误:
org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ' userRepositoryImpl': Requested bean is currently in creation: Is there an unresolvable circular reference?
一种可能但不太理想的解决方案是将 EntityManager
注入(inject) UserRepositoryImp
,但在这种情况下,我无法访问任何 Spring JPA CrudRepository
提供的方法,或我可能在 UserRepository 中创建的任何其他方法。
关于如何解决这个问题的任何建议?
任何帮助将不胜感激。
编辑:正如@shelley 的回答中提到的,我可以通过进行 3 处更改来解决这个问题:
- 从
UserRepositoryExtensionImpl
中删除 - 将
UserRepositoryExtensionImpl
重命名为UserRepositoryImpl
。显然,这使 Spring 意识到实现的存在。见 Spring Doc - 删除我的构造函数并将
@Autowired
移动到userRepository
字段
@Repository
成功!
最佳答案
需要更改一些小事情才能使其正常工作:
删除
@Repository
来自自定义存储库接口(interface) (UserRepositoryExtension
) 的注释。自定义存储库实现实际上应该命名为“
<StandardRepository>Impl
”而不是“<CustomRepository>Impl
”。在您的代码示例中,这应该是UserRepositoryImpl
而不是UserRepositoryExtensionImpl
.
关于java - 我的自定义存储库实现中的 CrudRepository,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124937/