[英]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
注册自定义编解码器( Encoder
、 Decoder
、 HttpMessageReader
、 HttpMessageWriter
)。
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.