Properly identify event-related ClassCastExceptions on JDK 11
Issue: SPR-17093
This commit is contained in:
		
							parent
							
								
									142530874b
								
							
						
					
					
						commit
						e458777925
					
				|  | @ -173,7 +173,7 @@ public class SimpleApplicationEventMulticaster extends AbstractApplicationEventM | |||
| 		} | ||||
| 		catch (ClassCastException ex) { | ||||
| 			String msg = ex.getMessage(); | ||||
| 			if (msg == null || matchesClassCastMessage(msg, event.getClass().getName())) { | ||||
| 			if (msg == null || matchesClassCastMessage(msg, event.getClass())) { | ||||
| 				// Possibly a lambda-defined listener which we could not resolve the generic event type for | ||||
| 				// -> let's suppress the exception and just log a debug message. | ||||
| 				Log logger = LogFactory.getLog(getClass()); | ||||
|  | @ -187,14 +187,18 @@ public class SimpleApplicationEventMulticaster extends AbstractApplicationEventM | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private boolean matchesClassCastMessage(String classCastMessage, String eventClassName) { | ||||
| 		// On Java 8, the message simply starts with the class name: "java.lang.String cannot be cast..." | ||||
| 		if (classCastMessage.startsWith(eventClassName)) { | ||||
| 	private boolean matchesClassCastMessage(String classCastMessage, Class<?> eventClass) { | ||||
| 		// On Java 8, the message starts with the class name: "java.lang.String cannot be cast..." | ||||
| 		if (classCastMessage.startsWith(eventClass.getName())) { | ||||
| 			return true; | ||||
| 		} | ||||
| 		// On Java 9, the message contains the module name: "java.base/java.lang.String cannot be cast..." | ||||
| 		// On Java 11, the message starts with "class ..." a.k.a. Class.toString() | ||||
| 		if (classCastMessage.startsWith(eventClass.toString())) { | ||||
| 			return true; | ||||
| 		} | ||||
| 		// On Java 9, the message used to contain the module name: "java.base/java.lang.String cannot be cast..." | ||||
| 		int moduleSeparatorIndex = classCastMessage.indexOf('/'); | ||||
| 		if (moduleSeparatorIndex != -1 && classCastMessage.startsWith(eventClassName, moduleSeparatorIndex + 1)) { | ||||
| 		if (moduleSeparatorIndex != -1 && classCastMessage.startsWith(eventClass.getName(), moduleSeparatorIndex + 1)) { | ||||
| 			return true; | ||||
| 		} | ||||
| 		// Assuming an unrelated class cast failure... | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue