diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfiguration.java index 7d857957dba..2f47ea7f7c5 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfiguration.java @@ -20,20 +20,15 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionMessage; -import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.SpringBootCondition; import org.springframework.boot.autoconfigure.http.HttpProperties; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.codec.CodecCustomizer; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; -import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.core.annotation.Order; import org.springframework.http.codec.CodecConfigurer; import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.http.codec.json.Jackson2JsonEncoder; @@ -77,7 +72,7 @@ public class CodecsAutoConfiguration { static class LoggingCodecConfiguration { @Bean - @Conditional(LogRequestDetailsConfiguredCondition.class) + @Order(0) public CodecCustomizer loggingCodecCustomizer(HttpProperties properties) { return (configurer) -> configurer.defaultCodecs() .enableLoggingRequestDetails(properties.isLogRequestDetails()); @@ -85,23 +80,4 @@ public class CodecsAutoConfiguration { } - static class LogRequestDetailsConfiguredCondition extends SpringBootCondition { - - @Override - public ConditionOutcome getMatchOutcome(ConditionContext context, - AnnotatedTypeMetadata metadata) { - ConditionMessage.Builder message = ConditionMessage - .forCondition("Log Request Details"); - String property = context.getEnvironment() - .getProperty("spring.http.log-request-details"); - if (property == null) { - return ConditionOutcome.noMatch(message.because( - "did not find spring.http.log-request-details property")); - } - return ConditionOutcome - .match(message.because("spring.http.log-request-details property")); - } - - } - } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfigurationTests.java index d8abaf7b400..1f813b80358 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfigurationTests.java @@ -15,14 +15,18 @@ */ package org.springframework.boot.autoconfigure.http.codec; +import java.lang.reflect.Method; + import org.junit.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.http.HttpProperties; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.boot.web.codec.CodecCustomizer; +import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.http.codec.CodecConfigurer; import org.springframework.http.codec.support.DefaultClientCodecConfigurer; -import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.util.ReflectionUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -38,23 +42,48 @@ public class CodecsAutoConfigurationTests { @Test public void autoConfigShouldProvideALoggingRequestDetailsCustomizer() { - this.contextRunner.withPropertyValues("spring.http.log-request-details=false") - .run((context) -> { - CodecCustomizer customizer = context.getBean(CodecCustomizer.class); - CodecConfigurer configurer = new DefaultClientCodecConfigurer(); - customizer.customize(configurer); - boolean enableLoggingRequestDetails = (boolean) ReflectionTestUtils - .getField(configurer.defaultCodecs(), - "enableLoggingRequestDetails"); - assertThat(enableLoggingRequestDetails).isFalse(); - }); + this.contextRunner.run((context) -> { + CodecCustomizer customizer = context.getBean(CodecCustomizer.class); + CodecConfigurer configurer = new DefaultClientCodecConfigurer(); + customizer.customize(configurer); + assertThat(configurer.defaultCodecs()) + .hasFieldOrPropertyWithValue("enableLoggingRequestDetails", false); + }); } @Test - public void autoConfigWhenLoggingRequestDetailsPropertyNotSetShouldNotProvideCustomizer() { - this.contextRunner.run( - (context) -> assertThat(context).doesNotHaveBean(CodecCustomizer.class)); + public void loggingRequestDetailsCustomizerShouldUseHttpProperties() { + this.contextRunner.withPropertyValues("spring.http.log-request-details=true") + .run((context) -> { + CodecCustomizer customizer = context.getBean(CodecCustomizer.class); + CodecConfigurer configurer = new DefaultClientCodecConfigurer(); + customizer.customize(configurer); + assertThat(configurer.defaultCodecs()).hasFieldOrPropertyWithValue( + "enableLoggingRequestDetails", true); + }); + } + + @Test + public void loggingRequestDetailsBeanShouldHaveOrderZero() { + this.contextRunner.run((context) -> { + Method customizerMethod = ReflectionUtils.findMethod( + CodecsAutoConfiguration.LoggingCodecConfiguration.class, + "loggingCodecCustomizer", HttpProperties.class); + Integer order = new TestAnnotationAwareOrderComparator() + .findOrder(customizerMethod); + assertThat(order).isEqualTo(0); + }); + } + + static class TestAnnotationAwareOrderComparator + extends AnnotationAwareOrderComparator { + + @Override + public Integer findOrder(Object obj) { + return super.findOrder(obj); + } + } }