简体   繁体   English

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

[英]How do I define a custom HttpMessageConverter for the reactive Spring WebClient (Spring-WebFlux)

For the Spring org.springframework.web.client.RestTemplate , it was relatively easy to define an own HttpMessageConverter:对于 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);
    }
}

When converting my client to an reactive WebClient, I did not find a suitable way to define my own message converter as before with the RestTemplate.将我的客户端转换为响应式 WebClient 时,我没有找到一种合适的方法来像以前一样使用 RestTemplate 定义我自己的消息转换器。

Background: Our spring boot project is based on Scala and we use our own converter (based on com.fasterxml.jackson.module.scala.JacksonModule ) to process Scala Case classes.背景:我们的 spring boot 项目是基于 Scala 的,我们使用我们自己的转换器(基于com.fasterxml.jackson.module.scala.JacksonModule )来处理 Scala Case 类。

You can register custom codecs( Encoder , Decoder , HttpMessageReader , HttpMessageWriter ) via WebClient.builder() for your WebClient in the reactive world.您可以通过WebClient.builder()为响应式世界中的WebClient注册自定义编解码器( EncoderDecoderHttpMessageReaderHttpMessageWriter )。

  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();

If you're using Spring Boot with WebFlux, you can add a CodecCustomizer bean, which you can use to register your own custom codecs:如果您将 Spring Boot 与 WebFlux 一起使用,您可以添加一个CodecCustomizer bean,您可以使用它来注册您自己的自定义编解码器:

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

By the way, when using Spring Boot with WebMVC, you can just add your HttpMessageConverter implementation as a bean and it will get picked up.顺便说一句,当使用带有 WebMVC 的 Spring Boot 时,您只需将HttpMessageConverter实现添加为 bean,它就会被接收。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM