设置WebClient.Builder.exchangeStrategies()而不会丢失Spring Jackson配置 [英] Set WebClient.Builder.exchangeStrategies() without losing Spring Jackson configuration

查看:1081
本文介绍了设置WebClient.Builder.exchangeStrategies()而不会丢失Spring Jackson配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下代码(来自此答案)来配置要在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆