在不丢失 Spring Jackson 配置的情况下设置 WebClient.Builder.exchangeStrategies()
Posted
技术标签:
【中文标题】在不丢失 Spring Jackson 配置的情况下设置 WebClient.Builder.exchangeStrategies()【英文标题】:Set WebClient.Builder.exchangeStrategies() without losing Spring Jackson configuration 【发布时间】:2019-04-25 22:33:18 【问题描述】:我正在使用以下代码(来自 this answer)来配置要记录在 WebClient 请求上的标头:
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 我有:
spring.jackson.default-property-inclusion=non-null
spring.jackson.deserialization.accept-empty-string-as-null-object=true
被上面的代码覆盖。这是我的解决方法:
@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 配置被覆盖?
【问题讨论】:
【参考方案1】:从 Spring Boot 2.1.0 开始,您可以通过启用以下属性来实现:
spring.http.log-request-details=true
如果您使用的是以前的 Spring Boot 版本,您应该能够在不覆盖或重建整个配置的情况下对其进行自定义,如下所示:
@Configuration
static class LoggingCodecConfig
@Bean
@Order(0)
public CodecCustomizer loggingCodecCustomizer()
return (configurer) -> configurer.defaultCodecs()
.enableLoggingRequestDetails(true);
【讨论】:
以上是关于在不丢失 Spring Jackson 配置的情况下设置 WebClient.Builder.exchangeStrategies()的主要内容,如果未能解决你的问题,请参考以下文章
如何在不丢失 docker 数据的情况下更新 prometheus 配置文件
Jackson 如何在不强制转换的情况下将 JsonNode 转换为 ArrayNode?