[SPRING] SpringWebFlux WebClient JSON 직렬화를 사용자 정의하는 방법은 무엇입니까?
SPRINGSpringWebFlux 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.다음은 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.특정 웹 클라이언트에 대해이를 구성 할 수 있습니다.
특정 웹 클라이언트에 대해이를 구성 할 수 있습니다.
@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.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()
```
from https://stackoverflow.com/questions/43769301/how-to-customize-springwebflux-webclient-json-deserialization by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 백리향, 조각 및 기본 매개 변수 (0) | 2019.09.13 |
---|---|
[SPRING] 예제 applicationContext.xml 파일을 찾을 수있는 곳 (0) | 2019.09.13 |
[SPRING] java.io.FileNotFoundException : 클래스 경로 자원이 없기 때문에 열 수 없습니다. (0) | 2019.09.13 |
[SPRING] Spring Boot IntegrationTest에서 @Schedule 비활성화 (0) | 2019.09.13 |
[SPRING] Spring 3.0 HEAD 요청 (0) | 2019.09.13 |