【问题标题】:How to use parameters in CDI events?如何在 CDI 事件中使用参数?
【发布时间】:2013-09-30 13:03:50
【问题描述】:

我正在寻找一种将某种参数添加到使用 CDI 事件机制传播的事件的方法。

我知道对于我的示例,我可以创建不同的事件,但我正在寻找一种方法来重用相同的事件,但使用不同的参数。然后用这个事件参数注解一些方法,以便在事件触发时只调用这个方法。

以下示例不起作用,但说明了我的意图。这有可能吗?

//custom event class
public class NotifyChange {

}

//change the model and notify the view
public class MyPresenter {
    @Inject
    private Events<NotifyChange> events;

    public void updateUser() {
        //change some user settings
        events.fire(new NotifyChange("user")); //that what I'm somehow looking for
    }

    public void updateCustomer() {
        //change some customer settings
        events.fire(new NotifyChange("customer"));
    }
}

//change the view according to events
public class MyView {
    void listenUserChange(@Observes NotifyChange("user") evt) {
        //update UI
    }

    void listenCustomerChange(@Observes NotifyChange("customer") evt) {
        //update UI
    }
}

【问题讨论】:

  • 我相信这可以通过资格赛来完成。请参阅specs,第 10 章“事件”并阅读有关限定符的信息。
  • 阅读 te jee6 教程中的账单支付示例:docs.oracle.com/javaee/6/tutorial/doc/gkhpa.html 它在 PaymentEvent 事件中定义了一个 paymentOption 属性。
  • @DwB 这不是我想要的。该文档建议为每个事件创建不同的注释以在它们之间有所不同。我正在寻找一种方法来避免这种情况。

标签: java jakarta-ee vaadin cdi


【解决方案1】:

如果您想避免为每个事件创建类和注释,我想最好的方法是使用限定符参数。您的代码如下所示:

//MyPresenter.class
@Inject @ChangeType(Role.USER)
private Event<NotifyChange> userEvent;

@Inject @ChangeType(Role.CUSTOMER)
private Event<NotifyChange> custumerEvent;

public void updateUser() {
    userEvent.fire(new NotifyChange());
}

public void updateCustomer() {
    custumerEvent.fire(new NotifyChange());
}


//MyView.class
public void listenUserChange(
        @Observes @ChangeType(Role.USER) NotifyChange evt) {
}

void listenCustomerChange(
        @Observes @ChangeType(Role.CUSTOMER) NotifyChange evt) {
}

//Role.class
public enum Role {
USER, CUSTOMER
}

//ChangeType 
@Qualifier
@Target({ PARAMETER, FIELD })
@Retention(RUNTIME)
    public @interface ChangeType {

    Role value();
}

更多文档:http://docs.jboss.org/weld/reference/1.1.5.Final/en-US/html_single/#d0e4018

【讨论】:

  • 角色枚举是可选的。如果你想让它更简单,你可以使用 String 代替,只需更改 ChangeType.value 的类型并相应地调整代码。
  • 这将是正确的方法,并让它在观察者端通过。
  • 这确实是一个非常好的解决方案!
  • 如果您只想使用一个事件对象,您可以使用 select() 方法“选择”限定符...See one of those Event#select overloading methods
猜你喜欢
  • 2016-07-28
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2012-05-29
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多