Я пытаюсь получить ссылку на мой интерфейс репозитория (UserRepository
), который расширяет CrudRepository
в моей пользовательской реализации (UserRepositoryExtensionImpl
), чтобы получить доступ ко всем методам, предоставленным 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
, но в этом случае у меня нет доступа к каким-либо из методов Spring JPA, предоставляемых CrudRepository
, или любые дополнительные методы, которые я мог бы создать в UserRepository.
Любые предложения о том, как обойти это?
Любая помощь будет принята с благодарностью.
EDIT: Как упоминалось в ответе @shelley, я смог решить это, сделав 3 изменения:
- Удаление
@Repository
изUserRepositoryExtensionImpl
- Переименование
UserRepositoryExtensionImpl
наUserRepositoryImpl
. По-видимому, это означает, что Spring знает о существовании реализации. См. Spring Doc - Удаление моего конструктора и перемещение поля
@Autowired
в полеUserRepository
УСПЕХ!