How to customize SpringWebFlux WebClient JSON deserialization? How to customize SpringWebFlux WebClient JSON deserialization? spring spring

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