2016-05-31 2 views
1

@Qualifierを必要とせずに、汎用のパラメータに基づいて正しいタイプのオートワイヤリングが可能です。しかし、私は@Transactional注釈を付けるとすぐに、一般的なパラメータに基づいてオートワイヤリングすることはできません。問題を説明する目的でのみ作成されたこの例を考えてみましょう。@Transactionalで動作しない汎用オートワイヤリング

interface Product {} 

interface Book extends Product {} 

interface Toy extends Product {} 

interface Store<P extends Product> {} 

@Component 
class BookStore implements Store<Book> {} 

@Component 
class ToyStore implements Store<Toy> {} 

@Component  
class BookDealer { 

    @Autowired 
    BookDealer(Store<Book> store) { 
    ... 
    } 

    void inventoryBooks() { 
    ... doesn't really matter what this does ... 
    } 
} 

上記のコードは正常に機能します。 BookStoreクラスは、問題なしでBookDealerコンストラクタにオートワイヤードされています。私はinventoryBooks()と呼ぶことができ、それは正常に動作します。

ただし、@TransactionalアノテーションをinventoryBooks()へのコールの上流のメソッドに追加すると、それを呼び出すクライアントメソッドでは、BookDealerはもはやオートワイヤではなくなり、具体的な型を注入するか、@Qualifierを使用する必要があります。エラーは、コンストラクタ引数に一致する2つのBeanがBookDealerであることです。つまり、BookStoreとの両方を意味し、Springはどちらが必要かを判断できません。これは、Springが@Transactionalのいくつかのアップストリームメソッドがプロキシされているので、Springがジェネリック型を検出できなくなったことを示しています。とにかくそのようなもの...

私はインターフェイスに固執したいと思います。@Qualifierを使用しません。 @Transactionalでこれを行う方法はありますか、またはそれはgenericsとautowiringの既知の制限で、@Transactionalのようなものですか?

+0

ジェネリックautowiringが@Transactionalで動作しなかった理由を知ることができましたか? –

+0

私はしなかった、申し訳ありません。 – SingleShot

+0

ナッツ...現在、舞台裏で起こっていることをよりよく理解するために、GenericCollectionTypeResolver、ResolvableType、GenericTypeAwareAutowireCandidateResolverをステップ実行します。 –

答えて

-1

Springは、デフォルトでAOPで使用されるプロキシを生成するためにJDKプロキシを使用します。 JDKプロキシはインターフェイスに基づいています。だから、あなたが具体的なクラスをautowireする必要があるとき、それはおそらく問題です。ですから、代わりにcglibを使用して(denpendencyを追加してください)、春の設定ファイルの ""を ""に設定してみてください。それが役に立てば幸い。 Using @Transaction annotation with @Autowired - Spring

関連する問題