Установите WebClient.Builder.exchangeStrategies (), не теряя конфигурацию Spring Jackson - PullRequest
0 голосов
/ 23 ноября 2018

Я использую следующий код (из этого ответа ) для настройки заголовков, которые должны регистрироваться при запросах WebClient:

ExchangeStrategies exchangeStrategies = ExchangeStrategies.withDefaults();
exchangeStrategies
    .messageWriters().stream()
    .filter(LoggingCodecSupport.class::isInstance)
    .forEach(writer -> ((LoggingCodecSupport)writer).setEnableLoggingRequestDetails(true));

client = WebClient.builder()
    .exchangeStrategies(exchangeStrategies)

Это работает, но приводит к тому, что моя конфигурация Джексона будетпотерял.В моем 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 Ответ

0 голосов
/ 23 ноября 2018

Начиная с 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);
    }

}
...