我的自定义存储库实现中的CrudRepository

Jul*_* B. 17 java spring hibernate spring-mvc spring-data-jpa

我试图获得对我的自定义实现()中UserRepository扩展的我的存储库接口()的引用,以便获得对Spring JPA提供的所有方法的访问.CrudRepositoryUserRepositoryExtensionImpl

Crud扩展:

@Repository
public interface UserRepository extends CrudRepository<User, String>, UserRepositoryExtension<RosterUser> {
    ...any custom spring JPA methods...
}
Run Code Online (Sandbox Code Playgroud)

扩展接口:

@Repository
public interface UserRepositoryExtension <T> {
   public T put(T entity);
}
Run Code Online (Sandbox Code Playgroud)

定制实施:

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;
    }...
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法注入,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?
Run Code Online (Sandbox Code Playgroud)

一个可能但不太理想的解决方案是注入和EntityManager注入UserRepositoryImp,但在这种情况下,我无法访问CrudRepository我在UserRepository中创建的任何Spring JPA方法或任何其他方法.

有关如何绕过这个的任何建议?

任何帮助将不胜感激.

编辑:正如在@ Shelley的回答中提到的,我能够通过进行3次更改来解决这个问题:

  • 卸下@RepositoryUserRepositoryExtensionImpl
  • 重命名UserRepositoryExtensionImplUserRepositoryImpl.显然,这使得Spring意识到实现的存在.见Spring Doc
  • 删除我的构造函数并移动@Autowired到该userRepository字段

成功!

she*_*ley 11

为了实现这一点,需要更改几件小事:

  • @Repository从自定义存储库接口(UserRepositoryExtension)中删除注释.

  • 自定义存储库实现实际上应该命名为" <StandardRepository>Impl"而不是" <CustomRepository>Impl".在您的代码示例中,这应该是UserRepositoryImpl代替UserRepositoryExtensionImpl.