Crud存储库在我的自定义存储库实现中

我正在尝试获取对我的存储库接口()的引用,该接口在我的自定义实现()中扩展,以便访问Spring JPA提供的所有方法。UserRepositoryCrudRepositoryUserRepositoryExtensionImpl

Crud Extension:

@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;
    }...
}

但是,我无法注入,因为存在循环依赖关系(鉴于它扩展了由my实现的接口)。我收到以下错误:UserRepositoryUserRepositoryUserRepositoryImpl

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name '    userRepositoryImpl': Requested bean is currently in creation: Is there an unresolvable circular     reference?

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

关于如何解决这个问题的任何建议?

任何帮助将不胜感激。

编辑:正如@shelley的答案中提到的,我能够通过进行3次更改来解决此问题:

  • 删除从@RepositoryUserRepositoryExtensionImpl
  • 重命名为 。显然,这让Spring意识到了实现的存在。见春季文档UserRepositoryExtensionImplUserRepositoryImpl
  • 删除我的构造函数并将 移动到字段@AutowireduserRepository

成功!


答案 1

需要更改一些小事情才能使其正常工作:

  • 从自定义存储库界面中删除注释 ()。@RepositoryUserRepositoryExtension

  • 自定义存储库实现实际上应该命名为“”而不是“”。在代码示例中,这应该代替 。<StandardRepository>Impl<CustomRepository>ImplUserRepositoryImplUserRepositoryExtensionImpl


答案 2

正如shelley所指出的,命名对于使自动线工作非常重要。在下面的示例中,我遵循自定义接口及其实现的正确命名标准。但是我扩展JpaRepository的界面被命名为“ItemDao”而不是“ItemRepository”,这导致那个弹簧完全忽略了我的自定义实现......

OBS!!!应为“ItemRepository”

@Repository
public interface ItemDao extends JpaRepository<Item, Long>, ItemRepositoryCustom {}

我的界面

interface ItemRepositoryCustom {...}

我的实现类

class ItemRepositoryImpl implements ItemRepositoryCustom {...}

如果有人遇到类似的问题,请首先遵循以下链接中弹簧文档中使用的命名标准。

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations


推荐