gpt4 book ai didi

events - 使用成员的限定符动态触发 CDI 事件

转载 作者:行者123 更新时间:2023-12-04 13:43:26 27 4
gpt4 key购买 nike

我正在尝试在 JBoss AS6 上的后端服务中使用 CDI 事件——理想情况下,可以最大限度地重用代码。

我可以从文档中看到,我可以通过使用带有成员的限定符来减少必须创建的限定符注释类,例如

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface Type {
TypeEnum value();
}

我可以观察到这一点
public void onTypeAEvent(@Observes @Type(TypeEnum.TYPEA) String eventMsg) {...}

到现在为止还挺好。但是,为了进一步减少所需的类数量,我想要一个 EventFirer 类,其中引发的事件的限定符是动态的。没有成员的限定符不是问题:
public class DynamicEventFirer {

@Inject @Any private Event<String> event;

public void fireEvent(AnnotationLiteral<?> eventQualifier){
event.select(eventQualifier).fire("FIRED");
}
}

然后称为
dynamicEventFirer.fireEvent(new AnnotationLiteral<Type>() {});

但是限定符什么时候应该有成员呢?查看 AnnotationLiteral 的代码,它肯定是为成员设置的,并且类元素注释有示例:
new PayByQualifier() { public PaymentMethod value() { return CHEQUE; } }

这对我来说很有意义 - 您正在覆盖注释接口(interface)的 value() 方法。但是,当我自己尝试这个时:
dynamicEventFirer.fireEvent(new AnnotationLiteral<Type>() {
public TypeEnum value() {
return TypeEnum.TYPEA;
}
});

我收到异常
java.lang.RuntimeException: class uk.co.jam.concept.events.MemberQualifierEventManager$1 does not implement the annotation type with members uk.co.jam.concept.events.Type
at javax.enterprise.util.AnnotationLiteral.getMembers(AnnotationLiteral.java:69)
at javax.enterprise.util.AnnotationLiteral.hashCode(AnnotationLiteral.java:281)
at java.util.HashMap.getEntry(HashMap.java:344)
at java.util.HashMap.containsKey(HashMap.java:335)
at java.util.HashSet.contains(HashSet.java:184)
at org.jboss.weld.util.Beans.mergeInQualifiers(Beans.java:939)
at org.jboss.weld.bean.builtin.FacadeInjectionPoint.<init>(FacadeInjectionPoint.java:29)
at org.jboss.weld.event.EventImpl.selectEvent(EventImpl.java:96)
at org.jboss.weld.event.EventImpl.select(EventImpl.java:80)
at uk.co.jam.concept.events.DynamicEventFirer.fireEvent(DynamicEventFirer.java:20)

谁能看到我做错了什么? MemberQualifierEventManager 是一个 ApplicationScoped bean,它调用 DynamicEventFirer 来触发事件。

谢谢,

最佳答案

根据您的帖子,有一种更简洁的方法:

public class TypeQualifier extends AnnotationLiteral<Type> implements Type{

private TypeEnum type;

public TypeQualifier(TypeEnum t) {
this.type = t;
}

public TypeEnum value() {
return type;
}

}

然后像这样开火:
dynamicEventFirer.fireEvent(new TypeQualifier(TypeEnum.TYPEA));

关于events - 使用成员的限定符动态触发 CDI 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6925010/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com