Weld 中的 JavaEE CDI:通用事件?

2024-05-18

我有一个基于泛型的特定事件处理的想法,但似乎 Weld 无法处理它们。我询问了 google,但找不到替代的 CDI 扩展。

Question:是否有 CDI 扩展可以处理通用类型事件的事件传播?

下面是我遇到的明确问题。

我有三个常规事件:EntityCreated、EntityChanged 和 EntityDeleted。它们的基类定义如下:

public abstract class DatabaseEvent<TargetType> {

    public TargetType target;

    public DatabaseEvent(TargetType target) {
        this.target = target;
    }
}

事件是简单的继承类:

public class EntityCreatedEvent<TargetType> extends DatabaseEvent<TargetType> {

    public EntityCreatedEvent(TargetType target) {
        super(target);
    }
}

我这样解雇他们:

public abstract class MyHome<EntityType> {

    private EntityType entity;

    @Inject
    Event<EntityCreatedEvent<EntityType>> entityCreatedEvent;

    public void fireCreatedEvent() {
        EntityCreatedEvent<EntityType> payload = new EntityCreatedEvent<EntityType>(entity);
        entityCreatedEvent.fire(payload);
    }
}

我想这样观察他们:

public void handleProjectCreated(@Observes EntityCreatedEvent<Project> event) { ... }

启动服务器时,Weld 告诉我它无法处理通用类型的事件。 CDI 的做法是使用额外的限定符而不是泛型来区分它们,例如:

public void handleProjectCreated(@Observes @ProjectEvent EntityCreatedEvent event) { ... }

然而,我从那个事件中解雇了事件MyHome基类,我不能直接用@ProjectEvent:它可能不是一个项目,而是另一种类型。

到目前为止,我的解决方案是完全跳过输入并按如下方式处理它们:

public void handleProjectCreated(@Observes EntityCreatedEvent event) { 
    if(event.target instanceof Project) { ... }
}

这个解决方案还可以,但并不完美。


我想你可以通过动态绑定限定符成员来做到这一点。您的代码如下所示:

public abstract class MyHome {

    private EntityType entity;

    @Inject
    Event<EntityCreatedEvent> entityCreatedEvent;

    public void fireCreatedEvent() {
        entityCreatedEvent.select(getTypeBinding()).fire(new EntityCreatedEvent(entity));
    }

    private TypeBinding getTypeBinding() {
        return new TypeBinding() {
        public Class<? extends EntityType> value() {return entity.getClass();}
    };
}

@Qualifier
@Target({ PARAMETER, FIELD })
@Retention(RUNTIME)
public @interface EntityTypeQualifier {
    Class<? extends EntityType> value();
}

public abstract class TypeBinding extends AnnotationLiteral<EntityTypeQualifier> implements EntityTypeQualifier {}

//Observers
public void handleEntityType1Created(@Observes @EntityTypeQualifier(EntityType1.class) EntityCreatedEvent event) {}
public void handleEntityType2Created(@Observes @EntityTypeQualifier(EntityType2.class) EntityCreatedEvent event) {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Weld 中的 JavaEE CDI:通用事件? 的相关文章

随机推荐

  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • Django REST Framework:何时创建超链接资源以及何时创建嵌套资源?如何发布嵌套资源?

    我正在使用 Django REST 框架构建 REST Web API 事情进展顺利 但我偶然发现了嵌套资源的问题 起初 REST API 中的所有关系都是超链接的 例如 一篇文章看起来像这样 path http api myproject
  • UIImagePickerView 控制器 - 图像路径 - iphone

    UIImagePickerView控制器返回NSData的图像 我的要求是将图像的路径存储为 varchar 数据类型 从中选择图像后UIImagePickerView 如何获取iPhone照片库中所选图片的完整路径 我的应用程序不必担心在
  • Java - 如何将特殊字符放入字符串中

    Java 似乎有很好的字符串处理能力 尽管如此 我还是遇到了最简单的问题 我需要动态字符串 它们在运行时更改 因此字符串类型不是一个好的选择 因为它们是不可变的 所以我使用字符数组 设置起来有点痛苦 但至少它们是可以修改的 我想创建一个字符
  • 经典的asp字符编码

    我在经典 asp 网站中遇到西班牙字符问题 用户可以在 aspx 页面上的表单中提交他们的姓名 地址 然后 aspx 页面将 ajax post 发送到经典的 asp 页面 它所做的所有操作都存储在我们的 Sql 2008 DB 中 我可以
  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • 不变违规:requireNativeComponent:在 UIManager 中找不到“RNSVGSvgViewAndroid”

    我对标题中提到的错误感到头疼 我正在使用react native gifted charts https www npmjs com package react native gifted charts v 1 0 3 https www
  • 如何实时改变setInterval的速度

    我想知道如何实时更改 setInterval 的速度 例如 if score lt 10 repeater setInterval function spawnEnemy 1000 if score gt 10 repeater setIn
  • 阻止 IDE 自动添加使用单位

    我正在将 Lazarus 项目转移到德尔福西雅图 Lazarus 项目依赖于 40 多个单元 包括控件 并具有多种应用程序 在所有项目的使用条款中 他们使用了以下内容 uses Classes SysUtils Forms Controls
  • 使用 LINQ 通过一个属性比较两个列表

    假设我有以下内容 class Widget1 public int TypeID get set public string Color get set class Widget2 public int TypeID get set pub
  • 将两个表合并为一个输出

    假设我有两张表 已知营业时间 ChargeNum CategoryID Month Hours 111111 1 2 1 09 10 111111 1 3 1 09 30 111111 1 4 1 09 50 222222 1 3 1 09
  • JQuery Datepicker OnSelect 和 TextChanged 问题

    自从将 OnSelect 添加到我的 Datepicker 后 该控件不再触发 TextChanged 事件 我的代码如下 function datepicker minDate 0 dateFormat dd M yy onSelect
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • Pandas Groupby:如何使用两个 lambda 函数?

    我目前可以在 Pandas 中执行以下操作 但 FutureWarning 严厉地摇动着我的手指 grpd df groupby rank agg mean np mean meian np median min np min max np
  • 检测非聚焦窗口上的鼠标滚轮?

    我的目标是制作一个浮动工具栏 作为其自己的 C 应用程序 当用户在我上方使用滚轮时 我想更改可见的按钮 听起来很简单 应该只是这句话的问题 MouseWheel new MouseEventHandler Form1 MouseWheel
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • 3 个表的 SQL 查询(或联接)

    第一次在 Stack Overflow 上问问题 很棒的资源 但是只有一件事真正让我作为 SQL 新手感到困惑 我有三个表 我想获取与鲍勃的学生相关的所有导师的姓名 表 1 教师 ID Name 1 Bob 表 2 学生 STUDENT I
  • 在 Django 模板中使用 forloop.counter 值作为列表索引

    在我的 Django 1 1 1 应用程序中 我在视图中有一个函数 它向模板返回一系列数字和项目列表列表 例如 data item1 item2 item3 item4 item5 item6 item7 item8 item9 retur
  • DateTimePicker默认值:如何避免?

    Facts 我有一个带有 2 个选项卡的 TabControl 每个选项卡有 2 个 DateTimePicker 在 Load 事件中 我设置了所有 DTP 的值 所有 DTP 都将 ShowCheckBoxes 设置为 true 并将
  • Weld 中的 JavaEE CDI:通用事件?

    我有一个基于泛型的特定事件处理的想法 但似乎 Weld 无法处理它们 我询问了 google 但找不到替代的 CDI 扩展 Question 是否有 CDI 扩展可以处理通用类型事件的事件传播 下面是我遇到的明确问题 我有三个常规事件 En