From 530c7bee71a4fa2da99a7c6abb2ab2b1099ae766 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 18 Jan 2019 14:57:14 -0500 Subject: [PATCH] Do not auto-configure HttpMessageConverters in reactive web apps Closes gh-15712 --- ...ttpMessageConvertersAutoConfiguration.java | 21 +++++++++++++++++- ...ssageConvertersAutoConfigurationTests.java | 22 ++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.java index d412a1d4636..19c13148bdd 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 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. @@ -24,11 +24,16 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type; +import org.springframework.boot.autoconfigure.condition.NoneNestedConditions; import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration; +import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.http.converter.HttpMessageConverter; @@ -49,6 +54,7 @@ import org.springframework.http.converter.StringHttpMessageConverter; */ @Configuration @ConditionalOnClass(HttpMessageConverter.class) +@Conditional(NotReactiveWebApplicationCondition.class) @AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.class, JsonbAutoConfiguration.class }) @Import({ JacksonHttpMessageConvertersConfiguration.class, @@ -93,4 +99,17 @@ public class HttpMessageConvertersAutoConfiguration { } + static class NotReactiveWebApplicationCondition extends NoneNestedConditions { + + NotReactiveWebApplicationCondition() { + super(ConfigurationPhase.PARSE_CONFIGURATION); + } + + @ConditionalOnWebApplication(type = Type.REACTIVE) + private static class ReactiveWebApplication { + + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java index 5e8a44b4509..2acebe9c547 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 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. @@ -32,6 +32,8 @@ import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ContextConsumer; +import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; +import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.GenericApplicationContext; @@ -257,6 +259,24 @@ public class HttpMessageConvertersAutoConfigurationTests { "jsonbHttpMessageConverter")); } + @Test + public void whenServletWebApplicationHttpMessageConvertersIsConfigured() { + new WebApplicationContextRunner() + .withConfiguration(AutoConfigurations + .of(HttpMessageConvertersAutoConfiguration.class)) + .run((context) -> assertThat(context) + .hasSingleBean(HttpMessageConverters.class)); + } + + @Test + public void whenReactiveWebApplicationHttpMessageConvertersRestTemplateIsNotConfigured() { + new ReactiveWebApplicationContextRunner() + .withConfiguration(AutoConfigurations + .of(HttpMessageConvertersAutoConfiguration.class)) + .run((context) -> assertThat(context) + .doesNotHaveBean(HttpMessageConverters.class)); + } + private ApplicationContextRunner allOptionsRunner() { return this.contextRunner .withConfiguration(AutoConfigurations.of(GsonAutoConfiguration.class,