Spring JPAが提供するすべてのメソッドにアクセスするために、カスタム実装()内UserRepository
で拡張されたリポジトリインターフェース()への参照を取得しようとしています。CrudRepository
UserRepositoryExtensionImpl
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;
}...
}
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に実装の存在を認識させます。SpringDocを参照してください - コンストラクターを削除
@Autowired
して、userRepository
フィールドに移動します
成功!