2017-05-03 177 views
3

我使用的是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是不存在的,没有?)

回答

3

下面是定制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(); 
+0

你能告诉为什么不应用到默认编码解码器Jackson2ObjectMapperBuilderCustomizer的原因是什么? – hahn

+0

这听起来像是一个新问题 - 你可以创建一个吗? –

+1

接口已经改变了一点,现在你调用了ExchangeStrategies.builder()。codecs(config - > {config.defaultCodecs()。jackson2Encoder ... etc – f1dave

0

您可以为特定的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(); 
} 
0

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

```