bob*_*bel 3 generics events cdi java-ee-6 weld
我有一个基于泛型的特定事件处理的想法,但似乎Weld无法处理它们.我问谷歌但是找不到替代的CDI扩展.
问题:是否有CDI扩展,可以处理泛型类型事件的事件传播?
在下面我有明确的问题.
我有三个常规事件,EntityCreated,EntityChanged和EntityDeleted.它们的基类定义如下:
public abstract class DatabaseEvent<TargetType> {
public TargetType target;
public DatabaseEvent(TargetType target) {
this.target = target;
}
}
Run Code Online (Sandbox Code Playgroud)
然后事件是简单的继承类:
public class EntityCreatedEvent<TargetType> extends DatabaseEvent<TargetType> {
public EntityCreatedEvent(TargetType target) {
super(target);
}
}
Run Code Online (Sandbox Code Playgroud)
我像这样解雇他们:
public abstract class MyHome<EntityType> {
private EntityType entity;
@Inject
Event<EntityCreatedEvent<EntityType>> entityCreatedEvent;
public void fireCreatedEvent() {
EntityCreatedEvent<EntityType> payload = new EntityCreatedEvent<EntityType>(entity);
entityCreatedEvent.fire(payload);
}
}
Run Code Online (Sandbox Code Playgroud)
我想像这样观察它们:
public void handleProjectCreated(@Observes EntityCreatedEvent<Project> event) { ... }
Run Code Online (Sandbox Code Playgroud)
启动服务器时,Weld告诉我它无法处理泛型类型的事件.CDI的做法是使用额外的限定符而不是泛型来消除它们,例如:
public void handleProjectCreated(@Observes @ProjectEvent EntityCreatedEvent event) { ... }
Run Code Online (Sandbox Code Playgroud)
但是,我从该MyHome
基类中触发事件,在那里我不能只用以下内容触发@ProjectEvent
:它可能不是项目而是另一种类型.
到目前为止,我的解决方案是完全跳过键入并按照以下方式处理它们:
public void handleProjectCreated(@Observes EntityCreatedEvent event) {
if(event.target instanceof Project) { ... }
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案没问题,但并不完美.
我想你可以用dinamically绑定限定符成员来做到这一点.这就是您的代码的样子:
public abstract class MyHome {
private EntityType entity;
@Inject
Event<EntityCreatedEvent> entityCreatedEvent;
public void fireCreatedEvent() {
entityCreatedEvent.select(getTypeBinding()).fire(new EntityCreatedEvent(entity));
}
private TypeBinding getTypeBinding() {
return new TypeBinding() {
public Class<? extends EntityType> value() {return entity.getClass();}
};
}
@Qualifier
@Target({ PARAMETER, FIELD })
@Retention(RUNTIME)
public @interface EntityTypeQualifier {
Class<? extends EntityType> value();
}
public abstract class TypeBinding extends AnnotationLiteral<EntityTypeQualifier> implements EntityTypeQualifier {}
//Observers
public void handleEntityType1Created(@Observes @EntityTypeQualifier(EntityType1.class) EntityCreatedEvent event) {}
public void handleEntityType2Created(@Observes @EntityTypeQualifier(EntityType2.class) EntityCreatedEvent event) {}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1605 次 |
最近记录: |