diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java index 873d077277..bdd14cb31a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java @@ -266,18 +266,22 @@ public class WebFluxAutoConfiguration { @Override protected RequestMappingHandlerAdapter createRequestMappingHandlerAdapter() { - if (this.webFluxRegistrations != null - && this.webFluxRegistrations.getRequestMappingHandlerAdapter() != null) { - return this.webFluxRegistrations.getRequestMappingHandlerAdapter(); + if (this.webFluxRegistrations != null) { + RequestMappingHandlerAdapter adapter = this.webFluxRegistrations.getRequestMappingHandlerAdapter(); + if (adapter != null) { + return adapter; + } } return super.createRequestMappingHandlerAdapter(); } @Override protected RequestMappingHandlerMapping createRequestMappingHandlerMapping() { - if (this.webFluxRegistrations != null - && this.webFluxRegistrations.getRequestMappingHandlerMapping() != null) { - return this.webFluxRegistrations.getRequestMappingHandlerMapping(); + if (this.webFluxRegistrations != null) { + RequestMappingHandlerMapping mapping = this.webFluxRegistrations.getRequestMappingHandlerMapping(); + if (mapping != null) { + return mapping; + } } return super.createRequestMappingHandlerMapping(); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java index 2929d1936b..c8e39a3013 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java @@ -405,8 +405,11 @@ public class WebMvcAutoConfiguration { @Override protected RequestMappingHandlerAdapter createRequestMappingHandlerAdapter() { - if (this.mvcRegistrations != null && this.mvcRegistrations.getRequestMappingHandlerAdapter() != null) { - return this.mvcRegistrations.getRequestMappingHandlerAdapter(); + if (this.mvcRegistrations != null) { + RequestMappingHandlerAdapter adapter = this.mvcRegistrations.getRequestMappingHandlerAdapter(); + if (adapter != null) { + return adapter; + } } return super.createRequestMappingHandlerAdapter(); } @@ -491,8 +494,11 @@ public class WebMvcAutoConfiguration { @Override protected RequestMappingHandlerMapping createRequestMappingHandlerMapping() { - if (this.mvcRegistrations != null && this.mvcRegistrations.getRequestMappingHandlerMapping() != null) { - return this.mvcRegistrations.getRequestMappingHandlerMapping(); + if (this.mvcRegistrations != null) { + RequestMappingHandlerMapping mapping = this.mvcRegistrations.getRequestMappingHandlerMapping(); + if (mapping != null) { + return mapping; + } } return super.createRequestMappingHandlerMapping(); } @@ -510,8 +516,12 @@ public class WebMvcAutoConfiguration { @Override protected ExceptionHandlerExceptionResolver createExceptionHandlerExceptionResolver() { - if (this.mvcRegistrations != null && this.mvcRegistrations.getExceptionHandlerExceptionResolver() != null) { - return this.mvcRegistrations.getExceptionHandlerExceptionResolver(); + if (this.mvcRegistrations != null) { + ExceptionHandlerExceptionResolver resolver = this.mvcRegistrations + .getExceptionHandlerExceptionResolver(); + if (resolver != null) { + return resolver; + } } return super.createExceptionHandlerExceptionResolver(); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java index 6383339162..f5fa5b2492 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java @@ -388,16 +388,20 @@ class WebFluxAutoConfigurationTests { @Test void customRequestMappingHandlerMapping() { - this.contextRunner.withUserConfiguration(CustomRequestMappingHandlerMapping.class) - .run((context) -> assertThat(context).getBean(RequestMappingHandlerMapping.class) - .isInstanceOf(MyRequestMappingHandlerMapping.class)); + this.contextRunner.withUserConfiguration(CustomRequestMappingHandlerMapping.class).run((context) -> { + assertThat(context).getBean(RequestMappingHandlerMapping.class) + .isInstanceOf(MyRequestMappingHandlerMapping.class); + assertThat(context.getBean(CustomRequestMappingHandlerMapping.class).handlerMappings).isEqualTo(1); + }); } @Test void customRequestMappingHandlerAdapter() { - this.contextRunner.withUserConfiguration(CustomRequestMappingHandlerAdapter.class) - .run((context) -> assertThat(context).getBean(RequestMappingHandlerAdapter.class) - .isInstanceOf(MyRequestMappingHandlerAdapter.class)); + this.contextRunner.withUserConfiguration(CustomRequestMappingHandlerAdapter.class).run((context) -> { + assertThat(context).getBean(RequestMappingHandlerAdapter.class) + .isInstanceOf(MyRequestMappingHandlerAdapter.class); + assertThat(context.getBean(CustomRequestMappingHandlerAdapter.class).handlerAdapters).isEqualTo(1); + }); } @Test @@ -646,12 +650,15 @@ class WebFluxAutoConfigurationTests { @Configuration(proxyBeanMethods = false) static class CustomRequestMappingHandlerAdapter { + private int handlerAdapters = 0; + @Bean WebFluxRegistrations webFluxRegistrationsHandlerAdapter() { return new WebFluxRegistrations() { @Override public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() { + CustomRequestMappingHandlerAdapter.this.handlerAdapters++; return new WebFluxAutoConfigurationTests.MyRequestMappingHandlerAdapter(); } @@ -674,12 +681,15 @@ class WebFluxAutoConfigurationTests { @Configuration(proxyBeanMethods = false) static class CustomRequestMappingHandlerMapping { + private int handlerMappings = 0; + @Bean WebFluxRegistrations webFluxRegistrationsHandlerMapping() { return new WebFluxRegistrations() { @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { + CustomRequestMappingHandlerMapping.this.handlerMappings++; return new MyRequestMappingHandlerMapping(); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java index c9f457e402..5609497349 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java @@ -104,6 +104,7 @@ import org.springframework.web.servlet.handler.HandlerExceptionResolverComposite import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; import org.springframework.web.servlet.i18n.FixedLocaleResolver; +import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver; @@ -553,16 +554,28 @@ class WebMvcAutoConfigurationTests { @Test void customRequestMappingHandlerMapping() { - this.contextRunner.withUserConfiguration(CustomRequestMappingHandlerMapping.class) - .run((context) -> assertThat(context).getBean(RequestMappingHandlerMapping.class) - .isInstanceOf(MyRequestMappingHandlerMapping.class)); + this.contextRunner.withUserConfiguration(CustomRequestMappingHandlerMapping.class).run((context) -> { + assertThat(context).getBean(RequestMappingHandlerMapping.class) + .isInstanceOf(MyRequestMappingHandlerMapping.class); + assertThat(context.getBean(CustomRequestMappingHandlerMapping.class).handlerMappings).isEqualTo(1); + }); } @Test void customRequestMappingHandlerAdapter() { - this.contextRunner.withUserConfiguration(CustomRequestMappingHandlerAdapter.class) - .run((context) -> assertThat(context).getBean(RequestMappingHandlerAdapter.class) - .isInstanceOf(MyRequestMappingHandlerAdapter.class)); + this.contextRunner.withUserConfiguration(CustomRequestMappingHandlerAdapter.class).run((context) -> { + assertThat(context).getBean(RequestMappingHandlerAdapter.class) + .isInstanceOf(MyRequestMappingHandlerAdapter.class); + assertThat(context.getBean(CustomRequestMappingHandlerAdapter.class).handlerAdapters).isEqualTo(1); + }); + } + + @Test + void customExceptionHandlerExceptionResolver() { + this.contextRunner.withUserConfiguration(CustomExceptionHandlerExceptionResolver.class) + .run((context) -> assertThat( + context.getBean(CustomExceptionHandlerExceptionResolver.class).exceptionResolvers) + .isEqualTo(1)); } @Test @@ -1085,12 +1098,15 @@ class WebMvcAutoConfigurationTests { @Configuration(proxyBeanMethods = false) static class CustomRequestMappingHandlerMapping { + private int handlerMappings; + @Bean WebMvcRegistrations webMvcRegistrationsHandlerMapping() { return new WebMvcRegistrations() { @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { + CustomRequestMappingHandlerMapping.this.handlerMappings++; return new MyRequestMappingHandlerMapping(); } @@ -1106,12 +1122,15 @@ class WebMvcAutoConfigurationTests { @Configuration(proxyBeanMethods = false) static class CustomRequestMappingHandlerAdapter { + private int handlerAdapters = 0; + @Bean WebMvcRegistrations webMvcRegistrationsHandlerAdapter() { return new WebMvcRegistrations() { @Override public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() { + CustomRequestMappingHandlerAdapter.this.handlerAdapters++; return new MyRequestMappingHandlerAdapter(); } @@ -1124,6 +1143,30 @@ class WebMvcAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + static class CustomExceptionHandlerExceptionResolver { + + private int exceptionResolvers = 0; + + @Bean + WebMvcRegistrations webMvcRegistrationsHandlerAdapter() { + return new WebMvcRegistrations() { + + @Override + public ExceptionHandlerExceptionResolver getExceptionHandlerExceptionResolver() { + CustomExceptionHandlerExceptionResolver.this.exceptionResolvers++; + return new MyExceptionHandlerExceptionResolver(); + } + + }; + } + + } + + static class MyExceptionHandlerExceptionResolver extends ExceptionHandlerExceptionResolver { + + } + @Configuration(proxyBeanMethods = false) @Import({ CustomRequestMappingHandlerMapping.class, CustomRequestMappingHandlerAdapter.class }) static class MultipleWebMvcRegistrations {