问题描述
@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
您不能使用
response.bodyToMono(Map.class)
通过这种方式,spring根本不知道要实际放入Map中的类型。您要放入整数吗?一个字符串?一个东西?不知道。
因此,您需要提供包含类型信息的内容。
bodyToMono(new ParameterizedTypeReference<Map<String,MyObjectDto>>() {})
ParameterizedTypeReference
是一个匿名类,它将为您保存您的类型信息。因此,当我们将类信息传递给泛型函数bodyToMono时,该类就像一个容器来保存您的类型信息,这样spring可以查看该对象的内容并找出您要使用的类型。