2013-09-30 17 views
1

我正在尋找一種方法來添加某種參數傳播使用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 
    } 
} 
+0

我相信這可以出線的事件來完成。請參閱[規格](http://download.oracle.com/otndocs/jcp/web_beans-1.0-fr-eval-oth-JSpec/),第10章「事件」並閱讀有關限定符。 –

+0

在te jee6教程中閱讀teppayment示例:http://docs.oracle.com/javaee/6/tutorial/doc/gkhpa.html它在PaymentEvent事件中定義了paymentOption屬性。 – DwB

+0

@DwB這不是我正在尋找的。文檔建議爲每個事件創建不同的註釋以區分它們。我正在尋找一種方法來避免這一點。 – membersound

回答

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

+0

角色枚舉是可選的。如果你想簡化它,你可以使用String來代替,只需改變ChangeType.value的類型並相應地調整代碼。 –

+1

這將是正確的方式來做到這一點,並讓它在觀察者端完成。 – LightGuard

+1

這確實是非常好的解決方案! – membersound