如何使用Spring ClientResponse使用Map?

问题描述

拳头,我有一个暴露的REST网址:

   @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 的地图?

解决方法

来自ParameterizedTypeReference<T>类的documentation

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

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

您不能使用

response.bodyToMono(Map.class)

通过这种方式,spring根本不知道要实际放入Map中的类型。您要放入整数吗?一个字符串?一个东西?不知道。

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

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

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