我正在尝试在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,因此它实现了自己的生产者和一个限定符: