Browse Source

SimpleApplicationEventMulticaster just swallows event downcast exceptions

Issue: SPR-14846
(cherry picked from commit fbad637)
pull/1229/head
Juergen Hoeller 10 years ago
parent
commit
2b18092396
  1. 9
      spring-context/src/main/java/org/springframework/context/event/SimpleApplicationEventMulticaster.java
  2. 58
      spring-context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java

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

@ -166,8 +166,13 @@ public class SimpleApplicationEventMulticaster extends AbstractApplicationEventM
listener.onApplicationEvent(event); listener.onApplicationEvent(event);
} }
catch (ClassCastException ex) { catch (ClassCastException ex) {
// Possibly a lambda-defined listener which we could not resolve the generic event type for if (ex.getMessage().startsWith(event.getClass().getName())) {
LogFactory.getLog(getClass()).debug("Non-matching event type for listener: " + listener, ex); // 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;
}
} }
} }
} }

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

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -379,6 +379,50 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen
context.close(); 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 @Test
public void beanPostProcessorPublishesEvents() { public void beanPostProcessorPublishesEvents() {
GenericApplicationContext context = new GenericApplicationContext(); GenericApplicationContext context = new GenericApplicationContext();
@ -415,7 +459,7 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen
public static class MyOrderedListener1 implements ApplicationListener<ApplicationEvent>, Ordered { public static class MyOrderedListener1 implements ApplicationListener<ApplicationEvent>, Ordered {
public final Set<ApplicationEvent> seenEvents = new HashSet<ApplicationEvent>(); public final Set<ApplicationEvent> seenEvents = new HashSet<>();
@Override @Override
public void onApplicationEvent(ApplicationEvent event) { public void onApplicationEvent(ApplicationEvent event) {
@ -452,14 +496,14 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen
@Override @Override
public void onApplicationEvent(MyEvent event) { public void onApplicationEvent(MyEvent event) {
assertTrue(otherListener.seenEvents.contains(event)); assertTrue(this.otherListener.seenEvents.contains(event));
} }
} }
public static class MyPayloadListener implements ApplicationListener<PayloadApplicationEvent> { public static class MyPayloadListener implements ApplicationListener<PayloadApplicationEvent> {
public final Set<Object> seenPayloads = new HashSet<Object>(); public final Set<Object> seenPayloads = new HashSet<>();
@Override @Override
public void onApplicationEvent(PayloadApplicationEvent event) { public void onApplicationEvent(PayloadApplicationEvent event) {
@ -470,7 +514,7 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen
public static class MyNonSingletonListener implements ApplicationListener<ApplicationEvent> { public static class MyNonSingletonListener implements ApplicationListener<ApplicationEvent> {
public static final Set<ApplicationEvent> seenEvents = new HashSet<ApplicationEvent>(); public static final Set<ApplicationEvent> seenEvents = new HashSet<>();
@Override @Override
public void onApplicationEvent(ApplicationEvent event) { public void onApplicationEvent(ApplicationEvent event) {
@ -482,7 +526,7 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen
@Order(5) @Order(5)
public static class MyOrderedListener3 implements ApplicationListener<ApplicationEvent> { public static class MyOrderedListener3 implements ApplicationListener<ApplicationEvent> {
public final Set<ApplicationEvent> seenEvents = new HashSet<ApplicationEvent>(); public final Set<ApplicationEvent> seenEvents = new HashSet<>();
@Override @Override
public void onApplicationEvent(ApplicationEvent event) { public void onApplicationEvent(ApplicationEvent event) {
@ -503,7 +547,7 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen
@Override @Override
public void onApplicationEvent(MyEvent event) { public void onApplicationEvent(MyEvent event) {
assertTrue(otherListener.seenEvents.contains(event)); assertTrue(this.otherListener.seenEvents.contains(event));
} }
} }

Loading…
Cancel
Save