当前位置: 首页 > 面试题库 >

使用带有成员的限定符动态触发CDI事件

屈健柏
2023-03-14
问题内容

我正在尝试在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; } }

这对我来说很有意义-您正在覆盖注释接口的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));


 类似资料:
  • 我有一个很简单的表格。当用户在输入字段中键入时,我想更新他们在页面上其他地方键入的内容。一切正常。我已将更新绑定到、和事件。 唯一的问题是,如果您从浏览器的自动完成框中选择一个输入,它不会更新。当您从“自动完成”中选择时,是否会触发任何事件(显然既不是也不是)。注意,如果您从“自动完成”框中选择“模糊输入”字段,将触发更新。我希望它能在自动完成时被触发。 请参见:http://jsfidle.ne

  • 这是我上一篇文章的后续文章 参考非静态成员函数 在下面 const-、vole-和ref限定的成员函数 非静态成员函数可以在没有ref限定符的情况下声明,...在重载解析期间,X类的非静态cv限定成员函数被处理如下: 无ref限定符:隐式对象参数具有对cv限定X的类型左值引用,并且还允许绑定右值隐式对象参数 为了进一步探索这一点,我试用了上面链接中提供的源代码,如下所示: 我已经在每个基于引用限定

  • 本文向大家介绍js 动态生成html 触发事件传参字符转义的实例,包括了js 动态生成html 触发事件传参字符转义的实例的使用技巧和注意事项,需要的朋友参考一下 通常,在使用 JS 动态生成 html 的过程中,会嵌入相应的样式、事件等属性元素,而这时经常会出现所谓的 “单、双引号不够用” 的情况,别急,这时可以利用 html 语言中的转义字符来解决。 下面就来介绍一下相应的转义字符吧: & —

  • 如果没有其他重载(比如,

  • 作为CDI的新手,我想知道替代方案和限定符之间的实际区别。 在焊缝参考中,它指出: 4.3. 限定符注释 如果我们有多个实现特定bean类型的bean,注入点可以使用限定符注释精确指定应该注入哪个bean。 但在解释替代方案时,据说: 4.7.备选方案 替代方案是bean,其实现特定于特定的客户端模块或部署场景。 如果我理解正确的话,@Qualifier定义了目标bean的哪些实现被注入到注入点。

  • 假设有一个SessionFactory的生产者(举个例子): 不,我可以这样使用我的数据库对象: 到目前为止,一切都很好。因此,让我们假设这些东西是在一个框架中实现的,并且将被几个应用程序使用。 现在,一个应用程序决定使用另一个SessionFactory,因此它实现了自己的生产者和一个限定符: