How to customize SpringWebFlux WebClient JSON deserialization?
Here's an example that customizes the ObjectMapper
for JSON (de)serialization.Note that for streaming purposes, different encoders/decoders are being used but the principle remains the same for their configuration.
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();
You can configure this for a specific WebClient:
@Autowiredpublic 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();}
But also on 'application level'
by configuring a CodecCustomizer
:
@Beanpublic 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)); };}
which will be made effective by the WebClientAutoConfiguration
as a WebClient.Builder
bean:
@Autowiredpublic ItunesAlbumServiceImpl(WebClient.Builder webclientBuilder) { webClient = webclientBuilder.baseUrl("https://itunes.apple.com").build();}
with webflux 5.0.2, de-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()