如何在CDI事件中使用参数?

时间:2013-09-30 13:03:51

标签: java java-ee vaadin cdi

我正在寻找一种方法来为使用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
    }
}

1 个答案:

答案 0 :(得分:4)

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

//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