Dinam dinamicamente evento CDI com qualificador com membros
Estou tentando usar eventos CDI em meus serviços de back-end, no JBoss AS6 - idealmente com a máxima reutilização de códig
Posso ver os documentos que posso reduzir nas classes de anotação do qualificador que tenho que criar usando um qualificador com membros, por exemplo,
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface Type {
TypeEnum value();
}
Eu posso observar isso com
public void onTypeAEvent(@Observes @Type(TypeEnum.TYPEA) String eventMsg) {...}
Por enquanto, tudo bem. No entanto, para reduzir ainda mais o número de classes necessárias, desejo ter uma classe EventFirer, em que o qualificador do evento lançado seja dinâmico. Não há problema com qualificadores sem membros:
public class DynamicEventFirer {
@Inject @Any private Event<String> event;
public void fireEvent(AnnotationLiteral<?> eventQualifier){
event.select(eventQualifier).fire("FIRED");
}
}
then chamado como
dynamicEventFirer.fireEvent(new AnnotationLiteral<Type>() {});
Mas e quando o qualificador deve ter membros? Olhando o código para AnnotationLiteral, certamente está configurado para membros, e o comentário do elemento de classe tem o exemplo:
new PayByQualifier() { public PaymentMethod value() { return CHEQUE; } }
Isso faz sentido para mim - você está substituindo o método value () da interface de anotação. No entanto, quando tentei isso sozinho:
dynamicEventFirer.fireEvent(new AnnotationLiteral<Type>() {
public TypeEnum value() {
return TypeEnum.TYPEA;
}
});
Eu recebo a exceção
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)
Alguém pode ver o que estou fazendo de errado? MemberQualifierEventManager é um bean ApplicationScoped que chama DynamicEventFirer para disparar o evento.
brigado, Ben