不失去Spring Jackson配置的情况下设置WebClient.Builder.exchangeStrategies()

3
我正在使用来自这个答案的以下代码来配置在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个回答

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);
    }

}

1
在Spring Boot 2.7.x中,该属性已被弃用,推荐使用spring.codec.log-request-details。但我不建议使用它,因为它不会记录请求和响应正文,而且标头值会被记录为“<filtered>”。 - pyb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接