这是我的出版商。
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不起作用。
1条答案
按热度按时间e5nqia271#
这不是
List<>
实现的问题。这个问题存在于每个使用泛型类型的事件中。正如another Stackoverflow post中所解释的,问题在于java处理泛型的方式。由于类型擦除,泛型将被Object
类型替换。因此,仅仅通过泛型类型来区分不同的事件是不可能的。你可以做的是,如上面链接的帖子所述,是实现你自己的List
类,它也实现了ResolvableTypeProvider
。它可能看起来像这样:字符串
注意:这个例子不适用于
MyList
的空示例,因为getFirst()
方法没有要返回的第一个元素。使用
CustomEvent
作为列表 Package 器的示例确实有效,因为事件侦听器不需要解析泛型,而可以简单地查找CustomEvent
类型的侦听器。有关更多信息,请查看上述帖子或Spring的ResolvableType和blogpost文档。