当参数为List时,Spring EventNode无法捕获事件< MyType>

crcmnpdw  于 7个月前  发布在  Spring
关注(0)|答案(1)|浏览(83)

这是我的出版商。

public void evnetMaker(){
  List<MyType> messages = ...;
  System.out.println("Event publish");
  applicationEventPublisher.publishEvnet(messages);
  System.out.println("End Event");
}

字符串
它是事件。

@EventListener
public void listenEvent(List<MyType> messages){
  System.out.println("Listen");
}


我预计

Event publish
Listen
End Event


但实际

Event publish
End Event


我认为evnet侦听器不能处理List<>。
所以我把它弄成这样。

public void evnetMaker(){
  List<MyType> messages = ...;
  ...
  applicationEventPublisher.publishEvnet(new CustomEvent(messages));
  ...
}


@EventListener
public void listenEvent(CustomEvent customEvent){
  ...
  customEvent.getMessages();
  ...
}


很好用。
我想知道为什么当参数为List<>时spring @ EventList不起作用。

e5nqia27

e5nqia271#

这不是List<>实现的问题。这个问题存在于每个使用泛型类型的事件中。正如another Stackoverflow post中所解释的,问题在于java处理泛型的方式。由于类型擦除,泛型将被Object类型替换。因此,仅仅通过泛型类型来区分不同的事件是不可能的。你可以做的是,如上面链接的帖子所述,是实现你自己的List类,它也实现了ResolvableTypeProvider。它可能看起来像这样:

class MyList<T> extends LinkedList<T> implements ResolvableTypeProvider {
    @Override
    public ResolvableType getResolvableType() {
        return ResolvableType.forClassWithGenerics(
                getClass(),
                ResolvableType.forInstance(getFirst()));
    }

}

字符串
注意:这个例子不适用于MyList的空示例,因为getFirst()方法没有要返回的第一个元素。
使用CustomEvent作为列表 Package 器的示例确实有效,因为事件侦听器不需要解析泛型,而可以简单地查找CustomEvent类型的侦听器。
有关更多信息,请查看上述帖子或Spring的ResolvableTypeblogpost文档。

相关问题