首页 > 解决方案 > 如何使用 Spring ClientResponse 使用 Map?

问题描述

拳头,我有一个像这样暴露的 REST url:

   @PostMapping("/check/existence")
   @ResponseBody
   public Map<String, MyObjectDto> checkExistence() {
   //some code 

然后,我有一个使用 Spring WebClient 的消费者,就像这样:

   ClientResponse response = webclient.post().uri....

我想做这样的事情:

   Map<String, MyObjectDto> responseDto = 
   response.bodyToMono(Map.class).block();

但控制台返回给我

   java.util.LinkedHashMap cannot be cast to  org.mypackage.MyObjectDto

那么,我如何使用类型为 Map<String, MyObjectDto> 的地图?

标签: javadictionarywebclientspring-webfluxconsuming

解决方案


从类的文档ParameterizedTypeReference<T>

此类的目的是启用捕获和传递泛型类型。为了捕获泛型类型并在运行时保留它,您需要创建一个子类(最好是匿名内联类),如下所示:

当您需要将某些内容序列化/反序列化为使用泛型的类型时(例如 Map<k, v> 或 List)

你不能使用

response.bodyToMono(Map.class)

由于这种方式,spring 不知道您要实际放入 Map 的类型。你要输入一个int吗?一个字符串?一个东西?它不知道。

因此,您需要提供包含类型信息的内容。

bodyToMono(new ParameterizedTypeReference<Map<String, MyObjectDto>>() {})

ParameterizedTypeReference是一个匿名类,它将为您保存您的类型信息。因此,当我们将类型信息传递给通用函数 bodyToMono 时,该类就像一个容器来保存您的类型信息,这样 spring 就可以查看该对象的内容并找出您想要使用的类型。


推荐阅读