java - 如何使用 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> 的地图?
解决方案
从类的文档ParameterizedTypeReference<T>
此类的目的是启用捕获和传递泛型类型。为了捕获泛型类型并在运行时保留它,您需要创建一个子类(最好是匿名内联类),如下所示:
当您需要将某些内容序列化/反序列化为使用泛型的类型时(例如 Map<k, v> 或 List)
你不能使用
response.bodyToMono(Map.class)
由于这种方式,spring 不知道您要实际放入 Map 的类型。你要输入一个int吗?一个字符串?一个东西?它不知道。
因此,您需要提供包含类型信息的内容。
bodyToMono(new ParameterizedTypeReference<Map<String, MyObjectDto>>() {})
ParameterizedTypeReference
是一个匿名类,它将为您保存您的类型信息。因此,当我们将类型信息传递给通用函数 bodyToMono 时,该类就像一个容器来保存您的类型信息,这样 spring 就可以查看该对象的内容并找出您想要使用的类型。
推荐阅读
- python - 有没有办法为 SWIG 的默认标准字符串参数生成函数注释?
- video - 如何将“scale2ref”集成到这个 ffmpeg 代码中?
- android - 如何使用 OneSignal 从 android 应用程序发送字符串?
- reactjs - 为什么我获取的数据没有出现在我的 React hooks 组件中?
- javascript - 入口点和基于路由的拆分有什么区别
- git - 在 vagrant 中更新 git 凭据
- javascript - 页面加载时运行的 JavaScript
- css - 动画右侧的关闭侧面板
- python - Cartopy 和 PIL 的问题
- reactjs - TypeError:无法读取 null React JS 的属性“包含”