设置WebClient.Builder.exchangeStrategies()而不会丢失Spring Jackson配置 [英] Set WebClient.Builder.exchangeStrategies() without losing Spring Jackson configuration
问题描述
我正在使用以下代码(来自此答案)来配置要在WebClient请求中记录的标头:
I'm using the following code (from this answer) to configure headers to be logged on WebClient requests:
ExchangeStrategies exchangeStrategies = ExchangeStrategies.withDefaults();
exchangeStrategies
.messageWriters().stream()
.filter(LoggingCodecSupport.class::isInstance)
.forEach(writer -> ((LoggingCodecSupport)writer).setEnableLoggingRequestDetails(true));
client = WebClient.builder()
.exchangeStrategies(exchangeStrategies)
这样可行,但导致我的Jackson配置丢失。在我的application.properties中,我有:
This works, but causes my Jackson configuration to be lost. In my application.properties I have:
spring.jackson.default-property-inclusion=non-null
spring.jackson.deserialization.accept-empty-string-as-null-object=true
被覆盖通过上面的代码。这是我的解决方法:
which gets overwritten by the above code. Here is my workaround:
@Autowired ObjectMapper objectMapper;
@Bean
WebClientCustomizer webClientCustomizer() {
return (WebClient.Builder builder) -> {
builder
.exchangeStrategies(createExchangeStrategiesWhichLogHeaders())
};
}
private ExchangeStrategies createExchangeStrategiesWhichLogHeaders() {
ExchangeStrategies exchangeStrategies =
ExchangeStrategies.builder()
.codecs(
clientDefaultCodecsConfigurer -> {
clientDefaultCodecsConfigurer
.defaultCodecs()
.jackson2JsonEncoder(
new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON));
clientDefaultCodecsConfigurer
.defaultCodecs()
.jackson2JsonDecoder(
new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON));
})
.build();
exchangeStrategies
.messageWriters()
.stream()
.filter(LoggingCodecSupport.class::isInstance)
.forEach(writer -> ((LoggingCodecSupport) writer).setEnableLoggingRequestDetails(true));
return exchangeStrategies;
}
这有效,但感觉有点奇怪。问题是:我是否需要像这样包含jackson / objectMapper配置,还是有一种更简单的方法可以避免Spring objectMapper配置被覆盖?
This works, but feels a bit strange. The question is: do I need to include the jackson/objectMapper configuration like this, or is there a simpler way to avoid the Spring objectMapper configuration being overwritten?
推荐答案
从Spring Boot 2.1.0开始,您可以通过启用以下属性来实现此目的:
As of Spring Boot 2.1.0, you can achieve this by enabling the following property:
spring.http.log-request-details=true
如果您使用的是以前的Spring Boot版本,你应该能够自定义它而不覆盖或重建整个配置,如下所示:
If you're on a previous Spring Boot version, you should be able to customize this without overwriting or rebuilding the whole configuration, like this:
@Configuration
static class LoggingCodecConfig {
@Bean
@Order(0)
public CodecCustomizer loggingCodecCustomizer() {
return (configurer) -> configurer.defaultCodecs()
.enableLoggingRequestDetails(true);
}
}
这篇关于设置WebClient.Builder.exchangeStrategies()而不会丢失Spring Jackson配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!