events - CDI 事件和泛型

标签 events generics cdi

我正在尝试发送事件并一般地执行此操作。我的意思是 - 创建一个具有泛型类型的抽象基础 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/

相关文章:

Objective-c : addTarget to UIButton not calling

.net - 将 .NET EventLogEntry 实例序列化为 XML

java - 我可以为具有特定注释的类创建通用接口(interface)吗?

c# - 在 C# 中,如何在方法中实例化传递的泛型类型?

ejb - 在 EJB 方法/@RequestScoped 和 @Stateless 之间传递状态

java - CDI 会(或应该)提供包限定符吗?

actionscript-3 - Actionscript 3.0 影片剪辑对 EXIT_FRAME 的修改

python - 异步 : Wait for event from other thread

generics - 如何确保Scala中的类型参数不同?

java - 多持久性上下文 CDI