Как определить пользовательский HttpMessageConverter для реактивного Spring WebClient (Spring-WebFlux) - PullRequest
2 голосов
/ 25 февраля 2020

Для Spring org.springframework.web.client.RestTemplate было относительно легко определить собственный HttpMessageConverter:

/**
 * Set the message body converters to use.
 * <p>These converters are used to convert from and to HTTP requests and responses.
 */
public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
    validateConverters(messageConverters);
    // Take getMessageConverters() List as-is when passed in here
    if (this.messageConverters != messageConverters) {
        this.messageConverters.clear();
        this.messageConverters.addAll(messageConverters);
    }
}

При преобразовании моего клиента в реактивный WebClient я не нашел подходящего способа определить свое собственное сообщение преобразователь, как и раньше, с RestTemplate.

Справочная информация: Наш проект с весенней загрузкой основан на Scala, и мы используем наш собственный преобразователь (на основе com.fasterxml.jackson.module.scala.JacksonModule) для обработки Scala классов Case.

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Вы можете зарегистрировать пользовательские кодеки (Encoder, Decoder, HttpMessageReader, HttpMessageWriter) через WebClient.builder() для вашего WebClient в реактивном мире.

  WebClient client = WebClient.builder()
                //see: https://github.com/jetty-project/jetty-reactive-httpclient
                //.clientConnector(new JettyClientHttpConnector())
                .clientConnector(new ReactorClientHttpConnector())
                .codecs(
                        clientCodecConfigurer ->{
                           // .defaultCodecs() set defaultCodecs for you
                           // clientCodecConfigurer.defaultCodecs();

                           //  You can customize an encoder based on the defualt config.
                           //  clientCodecConfigurer.defaultCodecs().jackson2Encoder(...)

                           // Or 
                           // use customCodecs to register Codecs from scratch.
                            clientCodecConfigurer.customCodecs().register(new Jackson2JsonDecoder());
                            clientCodecConfigurer.customCodecs().register(new Jackson2JsonEncoder());
                        }

                )
                .baseUrl("http://localhost:8080")
                .build();

0 голосов
/ 02 апреля 2020

Если вы используете Spring Boot с WebFlux, вы можете добавить bean-компонент CodecCustomizer, который можно использовать для регистрации ваших собственных пользовательских кодеков:

@Bean
CodecCustomizer myCustomCodecCustomizer(...) {
    return configurer -> configurer.customCodecs().register(...);
}

Кстати, при использовании Spring Boot с помощью Web MVC вы можете просто добавить реализацию HttpMessageConverter в виде компонента, и она будет подхвачена.

...