如何自定义SpringWebFlux WebClient JSON反序列化?
问题描述:
我使用的是spring-webflux WebClient(建20170502.221452-172)访问生产进入对象(应用程序/流+ JSON)这样的流的Web应用程序:如何自定义SpringWebFlux WebClient JSON反序列化?
final WebClient producerClient = WebClient.create("http://localhost:8080/");
Flux<Entry> entries = producerClient.get().uri("json-stream")
.accept(MediaType.APPLICATION_STREAM_JSON)
.exchange()
.flatMapMany(clientResponse -> clientResponse.bodyToFlux(Entry.class));
虽然的反序列化条目对象使用标准通用类型(包括Java时间(JSR-310)数据类型,如java.time.Instant)正常工作,我不知道为了向Java反序列化添加任何自定义JSON(例如,自定义Jackson ObjectMapper)。
我找不到WebClient中的任何API或者其构建器和流利API生成的对象的类中。
有人使用WebClient进行自定义反序列化吗?
(也许API是不存在的,没有?)
答
下面是定制ObjectMapper
的JSON(德)序列化的例子。 请注意,为了实现流式传输,正在使用不同的编码器/解码器,但其配置的原理保持不变。
ExchangeStrategies strategies = ExchangeStrategies
.builder()
.codecs(clientDefaultCodecsConfigurer -> {
clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(new ObjectMapper(), MediaType.APPLICATION_JSON));
clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(new ObjectMapper(), MediaType.APPLICATION_JSON));
}).build();
WebClient webClient = WebClient.builder().exchangeStrategies(strategies).build();
答
您可以为特定的Web客户端配置此:
@Autowired
public ItunesAlbumServiceImpl(ObjectMapper mapper) {
ExchangeStrategies strategies = ExchangeStrategies.builder().codecs(clientCodecConfigurer ->
clientCodecConfigurer.customCodecs().decoder(
new Jackson2JsonDecoder(mapper,
new MimeType("text", "javascript", StandardCharsets.UTF_8)))
).build();
webClient = WebClient.builder()
.exchangeStrategies(strategies)
.baseUrl("https://itunes.apple.com")
.build();
}
还能对 '应用级'
通过配置CodecCustomizer
:
@Bean
public CodecCustomizer jacksonLegacyJsonCustomizer(ObjectMapper mapper) {
return (configurer) -> {
MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
CodecConfigurer.CustomCodecs customCodecs = configurer.customCodecs();
customCodecs.decoder(
new Jackson2JsonDecoder(mapper, textJavascript));
customCodecs.encoder(
new Jackson2JsonEncoder(mapper, textJavascript));
};
}
将进行由WebClientAutoConfiguration
作为WebClient.Builder
bean有效:
@Autowired
public ItunesAlbumServiceImpl(WebClient.Builder webclientBuilder) {
webClient = webclientBuilder.baseUrl("https://itunes.apple.com").build();
}
答
与webflux 5.0.2,去registerDefaults ```
val strategies = ExchangeStrategies.builder()
.codecs { configurer ->
configurer.registerDefaults(false)
configurer.customCodecs().encoder(Jackson2JsonEncoder(objectMapper, APPLICATION_JSON))
configurer.customCodecs().decoder(Jackson2JsonDecoder(objectMapper, APPLICATION_JSON))
}.build()
```
你能告诉为什么不应用到默认编码解码器Jackson2ObjectMapperBuilderCustomizer的原因是什么? – hahn
这听起来像是一个新问题 - 你可以创建一个吗? –
接口已经改变了一点,现在你调用了ExchangeStrategies.builder()。codecs(config - > {config.defaultCodecs()。jackson2Encoder ... etc – f1dave