我正在尝试发送事件并一般地执行此操作。我的意思是 - 创建一个具有泛型类型的抽象基础 DAO 类并从其方法中触发事件。这应该适用于所有后代。如果我定义了确切的类型,则此方法有效,但如果我使用泛型,则无效。我的意思是说:
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);
}
}
PolisDAO 类,它扩展了 AbstractDAO 并定义了泛型类型:
@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 事件的“fire()”方法应该在运行时定义事件类型,而不是在编译或部署期间......当我调试时,我明白了
postSaveEvent.fire(obj);
来自第一个样本的操作与 Polis 实体完全一致。但是仍然没有触发任何事件......
更新。 我尝试了基本的泛型类,但没有运气:
@Inject @PostSaveEvent Event<Persistable> postSaveEvent;
谢谢。
最佳答案
这在理论上应该可行,但实际上在运行时使用 Java 反射检查泛型对象的类型有时是不可能的。这是由于类型删除。 IIRC 具体子类的类型没有被删除,所以应该可以重新连接它,但我猜现在的实现没有这样做。
将此作为错误归档到 http://issues.jboss.org/browse/WELD 中问题跟踪器(如果您使用 Weld),以您提供的类为例,我们可以尝试修复它。
要解决此问题,请尝试将事件注入(inject)具体子类,并将其作为参数传递,或使用访问器方法将其放入抽象父类(super class)中。
关于events - CDI 事件和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8962446/