【问题标题】:Set WebClient.Builder.exchangeStrategies() without losing Spring Jackson configuration在不丢失 Spring Jackson 配置的情况下设置 WebClient.Builder.exchangeStrategies()
【发布时间】: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 配置被覆盖?

【问题讨论】:

    标签: java spring-boot jackson spring-webflux


    【解决方案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);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 2021-12-10
      • 2017-01-11
      • 2021-08-19
      • 1970-01-01
      相关资源
      最近更新 更多