From b31f2bdad2d538c2573e1583a6a48edcd4d147e9 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 12 May 2020 12:57:42 +0100 Subject: [PATCH] @ExceptionHandler resolves nested exceptions See gh-23380 --- .../annotation/ExceptionHandlerMethodResolver.java | 4 ++-- .../ExceptionHandlerMethodResolverTests.java | 14 +++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java index c247262b25b..5fc02bd9ed8 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -134,7 +134,7 @@ public class ExceptionHandlerMethodResolver { if (method == null) { Throwable cause = exception.getCause(); if (cause != null) { - method = resolveMethodByExceptionType(cause.getClass()); + method = resolveMethodByThrowable(cause); } } return method; diff --git a/spring-web/src/test/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolverTests.java b/spring-web/src/test/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolverTests.java index 62ba5fadf58..1a2ebcf8153 100644 --- a/spring-web/src/test/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolverTests.java +++ b/spring-web/src/test/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -78,6 +78,18 @@ public class ExceptionHandlerMethodResolverTests { assertThat(resolver.resolveMethod(exception)).as("2nd lookup from cache").isNull(); } + @Test + public void resolveMethodExceptionCause() { + ExceptionHandlerMethodResolver resolver = new ExceptionHandlerMethodResolver(ExceptionController.class); + + SocketException bindException = new BindException(); + bindException.initCause(new FileNotFoundException()); + + Exception exception = new Exception(new Exception(new Exception(bindException))); + + assertThat(resolver.resolveMethod(exception).getName()).isEqualTo("handleSocketException"); + } + @Test public void resolveMethodInherited() { ExceptionHandlerMethodResolver resolver = new ExceptionHandlerMethodResolver(InheritedController.class);