【问题标题】:How do I define a custom HttpMessageConverter for the reactive Spring WebClient (Spring-WebFlux)如何为反应式 Spring WebClient (Spring-WebFlux) 定义自定义 HttpMessageConverter
【发布时间】:2020-06-09 04:07:14
【问题描述】:

对于 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 定义我自己的消息转换器。

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

【问题讨论】:

    标签: scala spring-boot spring-webflux


    【解决方案1】:

    您可以通过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();
    
    

    【讨论】:

    • 谢谢!为我工作。
    • @user2314859 如果它解决了您的问题,请接受答案,这可以帮助其他人。
    【解决方案2】:

    如果您使用带有 WebFlux 的 Spring Boot,您可以添加一个 CodecCustomizer bean,您可以使用它来注册您自己的自定义编解码器:

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

    顺便说一句,当使用带有 WebMVC 的 Spring Boot 时,您只需将 HttpMessageConverter 实现添加为 bean,它就会被拾取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-07
      • 2018-04-12
      • 2019-12-30
      • 2019-03-29
      • 2019-08-05
      • 2019-03-24
      • 2021-08-22
      • 2018-09-18
      相关资源
      最近更新 更多