एमएच मुझे यह नहीं मिला ... घटना का फायरिंग करने से पहले आपका वास्तविक कोड कैसा दिखता है? ASFAIK आप javax.enterprise.event.Event इंटरफ़ेस इंजेक्ट करते हैं और इसकी आग विधि को एक उदाहरण पास करते हैं, जिसके द्वारा बुलाए गए पर्यवेक्षक की घोषणा होती है। और यदि विरासत शामिल है, जैसे कि आपके मामले में, ऑब्जर्वर दोनों को बुलाया जाएगा, अगर आप डमीवेन्ट को आग लगाते हैं। यदि आप घटनाओं को आगे निर्दिष्ट करना चाहते हैं तो आप क्वालीफायर का उपयोग करेंगे।
@Inject @Any Event<DummyEvent> dummyEvent;
...
dummyEvent.fire(list.get(i));
/* संपादित करें */
"समस्या" कोड की निम्न पंक्ति है: जैसे ही आप घटना के प्रकार (MyEvent.class) specifiy रूप
weld.event().select(MyEvent.class).fire(evt);
, वास्तविक घटना उदाहरण का प्रकार (evt) अब कोई फर्क नहीं पड़ता। क्वालिफायर के साथ अपनी कक्षा हिराची का विस्तार करना एक संभावना है। उदाहरण के लिए: आप सटीक निर्दिष्ट कर सकते हैं जब आप सिर्फ आधार वर्ग के लिए, तुम कहाँ itarate एक सूची के माध्यम से उपयोग कर सकते है अपने उदाहरण की तरह
public void observerChild(@Observes @ChildEvent.Child BaseEvent child){
System.out.println("child with annotation event");
}
अंत में,,:
@ChildEvent.Child
public class ChildEvent extends BaseEvent{
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface Child{
}
public void eventAction() {
System.out.println("child");
}
}
उसके बाद आगे ऑब्जर्वर निर्दिष्ट ऐसे ही घटना फायरिंग से पहले/क्वालीफायर टाइप करें:
for (BaseEvent e : list){
childEvent.select(e.getClass().getAnnotations()[0]).fire(e);
}
जैसा कि ऊपर उल्लेख, यदि आप एक सामान्य पर्यवेक्षक (नीचे दिखाया गया) है, यह प्रत्येक घटना के लिए बुलाया जाएगा।
public void observerBase(@Observes BaseEvent base){
System.out.println("base event");
}
स्रोत
2012-01-30 20:33:10
आप कौन सी सीडीआई कार्यान्वयन का उपयोग कर रहे हैं? –
जेबॉस में 7 –