私はイベントを送信して一般的にこれを実行しようとしています。つまり、ジェネリック型の抽象基本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;
ありがとう:私は基本ジェネリッククラスが、運を試してみました。
ジェネリックの基本タイプでイベントを発生させるとどうなりますか?また、発生したイベントをテストするために使用しているオブザーバーをペーストできますか? – LightGuard