如何为反应式 Spring WebClient (Spring-WebFlux) 定义自定义 HttpMessageConverter

use*_*859 7 scala spring-boot spring-webflux

对于 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当将我的客户端转换为响应式 WebClient 时,我没有找到像以前那样使用 RestTemplate 定义我自己的消息转换器的合适方法。

背景:我们的 Spring Boot 项目是基于 Scala 的,我们使用自己的转换器(基于com.fasterxml.jackson.module.scala.JacksonModule)来处理 Scala Case 类。

Han*_*tsy 9

您可以通过为您的反应式世界注册自定义编解码器( EncoderDecoderHttpMessageReaderHttpMessageWriter) 。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();

Run Code Online (Sandbox Code Playgroud)