Provide loggingCodecCustomizer only if property is set

Fixes gh-14723
pull/14747/head
Madhura Bhave 6 years ago
parent 37c60b6603
commit b18751ebd9

@ -20,14 +20,20 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 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.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 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.http.HttpProperties;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.codec.CodecCustomizer; import org.springframework.boot.web.codec.CodecCustomizer;
import org.springframework.context.annotation.Bean; 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.context.annotation.Configuration;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.http.codec.CodecConfigurer; import org.springframework.http.codec.CodecConfigurer;
import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.http.codec.json.Jackson2JsonEncoder;
@ -71,6 +77,7 @@ public class CodecsAutoConfiguration {
static class LoggingCodecConfiguration { static class LoggingCodecConfiguration {
@Bean @Bean
@Conditional(LogRequestDetailsConfiguredCondition.class)
public CodecCustomizer loggingCodecCustomizer(HttpProperties properties) { public CodecCustomizer loggingCodecCustomizer(HttpProperties properties) {
return (configurer) -> configurer.defaultCodecs() return (configurer) -> configurer.defaultCodecs()
.enableLoggingRequestDetails(properties.isLogRequestDetails()); .enableLoggingRequestDetails(properties.isLogRequestDetails());
@ -78,4 +85,23 @@ 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"));
}
}
} }

@ -0,0 +1,60 @@
/*
* Copyright 2012-2018 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.http.codec;
import org.junit.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.boot.web.codec.CodecCustomizer;
import org.springframework.http.codec.CodecConfigurer;
import org.springframework.http.codec.support.DefaultClientCodecConfigurer;
import org.springframework.test.util.ReflectionTestUtils;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link CodecsAutoConfiguration}.
*
* @author Madhura Bhave
*/
public class CodecsAutoConfigurationTests {
private WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(CodecsAutoConfiguration.class));
@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();
});
}
@Test
public void autoConfigWhenLoggingRequestDetailsPropertyNotSetShouldNotProvideCustomizer() {
this.contextRunner.run(
(context) -> assertThat(context).doesNotHaveBean(CodecCustomizer.class));
}
}
Loading…
Cancel
Save