Description
Damien Hollis opened SPR-14846 and commented
We have a situation where an ApplicationListener was throwing a ClassCastException but we were never aware of this issue because invokeListener defaults to catching and suppressing ClassCastExceptions:
protected void invokeListener(ApplicationListener listener, ApplicationEvent event) {
ErrorHandler errorHandler = getErrorHandler();
if (errorHandler != null) {
try {
listener.onApplicationEvent(event);
}
catch (Throwable err) {
errorHandler.handleError(err);
}
}
else {
try {
listener.onApplicationEvent(event);
}
catch (ClassCastException 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);
}
}
}
This seems like a very bad idea and in our case led to a very subtle bug (luckily we had other checks and balances that showed we had an issue but it took a long time to track it down). I'm not sure what can happen with a lambda-defined listener, so I can't suggest a better solution than what you have.
We have now implemented our own ErrorHandler, so this issue is resolved for us but other users may not be aware of ClassCastExceptions in their own listeners.
Affects: 4.2.8, 4.3.3
Issue Links:
- Wrong detection of event type on ApplicationListener<> when using lambdas (ClassCast Exception) [SPR-14109] #18681 Wrong detection of event type on ApplicationListener<> when using lambdas (ClassCast Exception)
- Lambda error detection might not work on JDK 9 [SPR-16435] #20981 Lambda error detection might not work on JDK 9
- SimpleApplicationEventMulticaster should not rely on ClassCastException having a message [SPR-15145] #19711 SimpleApplicationEventMulticaster should not rely on ClassCastException having a message
- Classification of ClassCastExceptions doesn't work in JDK 11 (OpenJDK) [SPR-17093] #21630 Classification of ClassCastExceptions doesn't work in JDK 11 (OpenJDK)
Backported to: 4.2.9