2011-10-21 9 views
1

私はここで検索しましたが、答えは見つかりませんでした。ジェネリックタイプの@Injectの使用

私のアプリケーションでは、私のコントローラ用の抽象的なメインクラスをいくつかのメソッドとプロパティで持っています。そして私はDAOを自動的に注入したい。

abstract class AbstractController<E extends AbstractEntity, D extends AbstractDAO<E>> { 

    @Inject 
    private D dao; 

    // getters and setters 
} 

abstract class AbstractDAO<E extends AbstractEntity> { 
    @PersistentContext 
    private EntityManager em; 

    // finds returns E 
} 

// implemenation/usage 

class CarController extends AbstractController<Car, CarDAO> { 
} 

例外を取得:

org.jboss.weld.exceptions.DefinitionException: WELD-001407 Cannot declare an injection point with a type variable: [field] @Inject private AbstractController.dao 

使用:Glassfishの3.1とJSF 2.1を。

これに代わる回避策が存在しますか?

ありがとうございました。

+0

'D'はEJB(マネージドBean)ですか? –

+0

EJBセッション管理Bean(ステートレスまたはステートフル)を使用して、InitialContext.lookupを使用してgetメソッドにインスタンスを取得できます。しかし、私は@Dependentのような注射を使いたいです。あなたは私のために良いアイデアを持っていますか? – rogeriolino

+0

Guiceはこのようなことを処理できます。 – ysdx

答えて

2

リフレクションでは、ソースの汎用宣言によって適切な実行時の型を検出してキャストするのが技術的に非常に複雑です。溶接は単にそれをサポートしませんし、サポートしません。

良いAbstractDAO<E>に対してそれを宣言します。

private AbstractDAO<E> dao; 

あなたはとにかくDに対してそれを宣言すると、何も得ていません。

+0

Weldを使用して、クラス名でlookup/newInstance/...を使用してインスタンスを取得できますか? – rogeriolino

関連する問題