我试图获取对在我的自定义实现 ( ) 中UserRepository
扩展的存储库接口 () 的引用,以便访问 Spring JPA 提供的所有方法。CrudRepository
UserRepositoryExtensionImpl
粗扩展:
@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
扩展了 my 实现的接口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
,但在这种情况下,我无权访问由 提供的任何 Spring JPA 方法CrudRepository
,或我可能在 UserRepository 中创建的任何其他方法。
关于如何解决这个问题的任何建议?
任何帮助将不胜感激。
编辑:正如@shelley 的回答中提到的,我能够通过进行 3 处更改来解决这个问题:
- 删除
@Repository
从UserRepositoryExtensionImpl
- 重命名
UserRepositoryExtensionImpl
为UserRepositoryImpl
. 显然,这使 Spring 意识到实现的存在。参见Spring 文档 - 删除我的构造函数并将 移动
@Autowired
到该userRepository
字段
成功!