2013-02-27 6 views
14

SpringのJPAが提供するすべてのメソッドにアクセスするために、カスタム実装(UserRepositoryExtensionImpl)内でCrudRepositoryを拡張するリポジトリインタフェース(UserRepository)への参照を取得しようとしています。私のカスタムリポジトリの実装内のCrudRepository

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)。 UserRepositoryImp

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

可能、しかし、理想的なソリューションよりも少ないが、注入するだろうとEntityManagerが、その場合には、私はにより提供される春のJPAの方法のうちのいずれかへのアクセスを持っていない:私は次のエラーを取得していますCrudRepository、または私がUserRepositoryで作成した可能性のある追加のメソッド。

これを回避する方法についてのご意見はありますか?

ご協力いただければ幸いです。

EDIT:UserRepositoryImplUserRepositoryExtensionImplの名前を変更UserRepositoryExtensionImpl

  • から@Repository削除

    • :@のシェリーの答えで述べたように、私は3つの変更を加えることによってこの問題を解決することができました。どうやらこれによりSpringは実装の存在を認識します。私のコンストラクタを削除し、userRepositoryフィールド

    SUCCESSに@Autowiredを移動Spring Doc

  • 参照してください!

  • +0

    実際の循環依存関係がない場合(つまり:それはあなたが同様のタイプの多くの豆を持っていると考えているので春はただ混乱)。 Bean IDのような追加の修飾子を追加すると、SpringはどのBeanをオートワイヤするか知っています。 – gerrytan

    +0

    あなたの春のアプリのコンテキストを教えてください – Elbek

    +1

    @gerrytan - 私は間違っている可能性がありますが、私は循環依存があると思います。 FYI:同じ問題が参照されています[ここ](http://forum.springsource.org/showthread.php?132889-Spring-Data-Calling-default-CRUD-methods-inside-a-custom-repository-implementation&p= 439701#post439701) –

    答えて

    9

    カップル小さなものは、これが動作するために変更する必要があります

    • カスタムリポジトリインターフェース(UserRepositoryExtension)から@Repository注釈を削除します。

    • カスタムリポジトリの実装は、実際には「<CustomRepository>Impl」ではなく「<StandardRepository>Impl」という名前にする必要があります。コード例では、の代わりにUserRepositoryImplにする必要があります。

    +0

    ありがとうございます@シェリー!あなたの提案は、コンストラクタから '@ Autowired'を' userRepository'フィールドに移動することに加えて、問題を解決しました。カスタム実装で 'UserRepository'を参照できるようになりました。 :) –

    0

    あなたが従うべきであるwell defined way to create custom repository implementations in Spring Data JPAがあります。基本的にはCrudRepositoryを拡張する必要があるので、カスタム実装にそのインスタンスを挿入する必要はありません。

    +0

    私はOPがこのアプローチに従っていますが、カスタムリポジトリ実装内の標準リポジトリBeanからメソッドを使用したいと思います。 – shelley

    +0

    @ zagyi、Shelleyは正しいです。私はSpringが示唆しているのとまったく同じアプローチに従おうとしています。これは私の立場に自分自身を見いだした方法です。問題をより明確にするために質問に詳細を追加します。 –

    +0

    @シェルリー、@ジュリアン:申し訳ありませんが、慎重に質問を読んだ後、私はひどく誤解しています。しかし、私はジュリアンがやろうとしていることは奇妙なことだと思う。通常は、リポジトリインスタンスを挿入し、1つ以上のリポジトリ操作を呼び出す上位レベルのメソッドを実装するサービスクラスです。 'put() 'のロジックをサービスインタフェース/クラスに1つ上に移動する方が合理的でしょうか。 – zagyi

    0

    私はapplicationContext.getBean(UserRepository.class)を使用してApplicationContextを注入し、怠惰な方法でBeanを取得することによって、問題を解決しました。 このように動作します。

    4

    シェルレイが指摘しているように、命名規則はオートワイヤー作業を行う上で非常に重要です。以下の例では、私のカスタムインターフェイスとその実装のための適切な命名標準に従っています。しかし、JpaRepositoryを拡張した私のインターフェースは "ItemRepository"の代わりに "ItemDao"と命名されました。その結果、私のカスタム実装は完全に無視されました...

    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

    +1

    私は、これらのような詳細がより明示的に言及されることを願っています...しかし、確かに、命名はかなり重要であるようです。あなたもそれを理解することができてうれしい! –

    +1

    私には、以前の春の知識なしにドキュメントのセクションを読んだときに、命名規則の厳格さを理解する方法がありません。 – Olle89

    関連する問題