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

crcmnpdw  于 2023-11-17  发布在  Spring
关注(0)|答案(1)|浏览(163)

这是我的出版商。

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

字符串
它是事件。

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


我预计

  1. Event publish
  2. Listen
  3. End Event


但实际

  1. Event publish
  2. End Event


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

  1. public void evnetMaker(){
  2. List<MyType> messages = ...;
  3. ...
  4. applicationEventPublisher.publishEvnet(new CustomEvent(messages));
  5. ...
  6. }


  1. @EventListener
  2. public void listenEvent(CustomEvent customEvent){
  3. ...
  4. customEvent.getMessages();
  5. ...
  6. }


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

e5nqia27

e5nqia271#

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

  1. class MyList<T> extends LinkedList<T> implements ResolvableTypeProvider {
  2. @Override
  3. public ResolvableType getResolvableType() {
  4. return ResolvableType.forClassWithGenerics(
  5. getClass(),
  6. ResolvableType.forInstance(getFirst()));
  7. }
  8. }

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

展开查看全部

相关问题