如何自定义SpringWebFlux WebClient JSON反序列化?

新手上路,请多包涵

我正在使用 spring-webflux WebClient (build 20170502.221452-172)来访问一个 Web 应用程序,该应用程序生成一个 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 时间 (JSR-310) 数据类型,如 java.time.Instant)的 POJO 工作正常,但我想知道我需要做什么才能将任何自定义 JSON 添加到 Java 反序列化(例如,自定义 Jackson ObjectMapper)。

我在 WebClient 或其构建器和流畅的 API 生成的对象类中找不到任何 API 来执行此操作。

有人使用过自定义反序列化的 WebClient 吗?

(也许 API 还不存在?)

原文由 Martin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
1 个回答

下面是一个自定义 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();

原文由 Brian Clozel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题