2012-01-22 10 views
4

私はイベントを送信して一般的にこれを実行しようとしています。つまり、ジェネリック型の抽象基本DAOクラスを1つ作成し、そのメソッドからイベントを起動します。これはすべての子孫にとって有効です。これは、正確な型を定義していても動作しますが、ジェネリックを使用している場合は機能しません。私が何を意味するか:CDIイベントとジェネリック

AbstractDAOは(ジェネリックと - イベントを発生しません):

public abstract class AbstractDAO<T extends Persistable> implements Serializable { 
    @Inject @PostSaveEvent Event<T> postSaveEvent; 

    public T saveOrUpdate(T object) throws DatabaseException { 
     T obj = em.merge(object); 

     postSaveEvent.fire(obj); 
    } 
} 

AbstractDAO(無ジェネリック、単純なクラスキャスト - イベントを発生させます):

public abstract class AbstractDAO<T extends Persistable> implements Serializable { 
    @Inject @PostSaveEvent Event<Polis> postSaveEvent; 

    public T saveOrUpdate(T object) throws DatabaseException { 
     T obj = em.merge(object); 

     postSaveEvent.fire((Polis)obj); 
    } 
} 

AbstractDAOを拡張し、ジェネリック型を定義PolisDAOクラス:

@Stateless 
@Named 
@PolisType 
public class PolisDAO extends AbstractDAO<Polis> { 
    // some methods (saveOrUpdate is not overriden!) 
} 

マイオブザーバークラス:

@Stateless 
@Named 
public class ProlongationService { 

    public void attachProlongationToPolisOnSave(@Observes @PostSaveEvent Polis polis) throws DatabaseException { 
     // ... DO smth with polis object. This is NOT called in the first case and called in the second 
    } 

CDIのイベントのために「火()」メソッドが実行時にではなく、コンパイルまたは展開中のイベントタイプを定義する必要があり、これは、私にとって非常に奇妙です...私がデバッグすると、最初のサンプルからの

postSaveEvent.fire(obj); 

がポリスエンティティで正確に動作することがわかります。それにもかかわらず、イベントは発生しません...

更新します。

@Inject @PostSaveEvent Event<Persistable> postSaveEvent; 

ありがとう:私は基本ジェネリッククラスが、運を試してみました。

+0

ジェネリックの基本タイプでイベントを発生させるとどうなりますか?また、発生したイベントをテストするために使用しているオブザーバーをペーストできますか? – LightGuard

答えて

4

これは理論上はうまくいくはずですが、実際にJava Reflectionを使用して実行時に汎用オブジェクトのタイプを検査することは不可能です。これはタイプ消去によるものです。 IIRCでは、具体的なサブクラスの型は消去されないので、これを再接続することは可能ですが、実装はこれを現在行っていないと思います。

http://issues.jboss.org/browse/WELD問題追跡ツール(Weldを使用している場合)のバグとして、これを例として提供しているクラスを使って修正してみましょう。

回避するには、具体的なサブクラスにイベントを注入し、それを引数として渡すか、アクセサメソッドを使用して抽象スーパークラスに入れてみます。

+0

Thanksピート、jira https://issues.jboss.org/browse/WELD-1053を作成しました – bitec