Browse Source

SimpleApplicationEventMulticaster just swallows event downcast exceptions

Issue: SPR-14846
pull/1223/head
Juergen Hoeller 8 years ago
parent
commit
13001b9aff
  1. 5
      spring-context/src/main/java/org/springframework/context/event/SimpleApplicationEventMulticaster.java
  2. 44
      spring-context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java

5
spring-context/src/main/java/org/springframework/context/event/SimpleApplicationEventMulticaster.java

@ -166,9 +166,14 @@ public class SimpleApplicationEventMulticaster extends AbstractApplicationEventM @@ -166,9 +166,14 @@ public class SimpleApplicationEventMulticaster extends AbstractApplicationEventM
listener.onApplicationEvent(event);
}
catch (ClassCastException ex) {
if (ex.getMessage().startsWith(event.getClass().getName())) {
// Possibly a lambda-defined listener which we could not resolve the generic event type for
LogFactory.getLog(getClass()).debug("Non-matching event type for listener: " + listener, ex);
}
else {
throw ex;
}
}
}
}

44
spring-context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java

@ -379,6 +379,50 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen @@ -379,6 +379,50 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen
context.close();
}
@Test
public void anonymousClassAsListener() {
final Set<MyEvent> seenEvents = new HashSet<>();
StaticApplicationContext context = new StaticApplicationContext();
context.addApplicationListener(new ApplicationListener<MyEvent>() {
@Override
public void onApplicationEvent(MyEvent event) {
seenEvents.add(event);
}
});
context.refresh();
MyEvent event1 = new MyEvent(context);
context.publishEvent(event1);
context.publishEvent(new MyOtherEvent(context));
MyEvent event2 = new MyEvent(context);
context.publishEvent(event2);
assertSame(2, seenEvents.size());
assertTrue(seenEvents.contains(event1));
assertTrue(seenEvents.contains(event2));
context.close();
}
@Test
public void lambdaAsListener() {
final Set<MyEvent> seenEvents = new HashSet<>();
StaticApplicationContext context = new StaticApplicationContext();
ApplicationListener<MyEvent> listener = seenEvents::add;
context.addApplicationListener(listener);
context.refresh();
MyEvent event1 = new MyEvent(context);
context.publishEvent(event1);
context.publishEvent(new MyOtherEvent(context));
MyEvent event2 = new MyEvent(context);
context.publishEvent(event2);
assertSame(2, seenEvents.size());
assertTrue(seenEvents.contains(event1));
assertTrue(seenEvents.contains(event2));
context.close();
}
@Test
public void beanPostProcessorPublishesEvents() {
GenericApplicationContext context = new GenericApplicationContext();

Loading…
Cancel
Save