복붙노트

[SPRING] SpringWebFlux WebClient JSON 직렬화를 사용자 정의하는 방법은 무엇입니까?

SPRING

SpringWebFlux WebClient JSON 직렬화를 사용자 정의하는 방법은 무엇입니까?

spring-webflux WebClient (빌드 20170502.221452-172)를 사용하여 다음과 같이 Entry 객체 스트림 (application / stream + 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));

Entry 객체의 역 직렬화는 java.time.Instant와 같은 Java time (JSR-310) 데이터 유형을 포함한 표준 공통 유형을 사용하는 POJO에 대해 잘 작동하지만 Java 직렬화 해제에 사용자 정의 JSON을 추가하려면 어떻게해야하는지 궁금합니다. 예를 들어, 사용자 정의 Jackson ObjectMapper).

WebClient 또는 빌더 및 생성 된 API가 생성하는 객체 클래스에서 API를 찾을 수 없습니다.

사용자 정의 된 직렬화 해제와 함께 WebClient를 사용한 사람이 있습니까?

(아마도 API가 없습니까?)

해결법

  1. ==============================

    1.다음은 JSON (직렬) 직렬화를 위해 ObjectMapper를 사용자 정의하는 예제입니다. 스트리밍 목적으로 다른 인코더 / 디코더가 사용되지만 구성에 대한 원리는 동일하게 유지됩니다.

    다음은 JSON (직렬) 직렬화를 위해 ObjectMapper를 사용자 정의하는 예제입니다. 스트리밍 목적으로 다른 인코더 / 디코더가 사용되지만 구성에 대한 원리는 동일하게 유지됩니다.

        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();
    
  2. ==============================

    2.특정 웹 클라이언트에 대해이를 구성 할 수 있습니다.

    특정 웹 클라이언트에 대해이를 구성 할 수 있습니다.

    @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();
    }
    
  3. ==============================

    3.webflux 5.0.2에서 de-registerDefaults ```

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

    ```

  4. from https://stackoverflow.com/questions/43769301/how-to-customize-springwebflux-webclient-json-deserialization by cc-by-sa and MIT license