如何使用 Spring ClientResponse 使用 Map?
how to consume a Map with Spring ClientResponse?
拳头,我有一个 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();
但安慰我returns
java.util.LinkedHashMap cannot be cast to org.mypackage.MyObjectDto
那么,我如何使用类型为 Map 的地图?
来自documentation的classParameterizedTypeReference<T>
The purpose of this class is to enable capturing and passing a generic Type. In order to capture the generic type and retain it at runtime, you need to create a subclass (ideally as anonymous inline class) as follows:
当您需要 serialize/deserialize 某些东西到使用泛型的类型时(例如 Map 或 List)
您不能使用
response.bodyToMono(Map.class)
这样一来,spring 就不知道您想将什么类型实际放入 Map 中了。你要输入一个int吗?一个字符串?一个东西?它不知道。
因此您需要提供包含类型信息的内容。
bodyToMono(new ParameterizedTypeReference<Map<String, MyObjectDto>>() {})
ParameterizedTypeReference
是一个匿名的 class,它将为您保留您的类型信息。所以 class 就像一个容器来保存你的类型信息,因为我们将它传递给通用函数 bodyToMono 这样 spring 可以查看这个对象的内容并找出你想要使用的类型.
拳头,我有一个 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();
但安慰我returns
java.util.LinkedHashMap cannot be cast to org.mypackage.MyObjectDto
那么,我如何使用类型为 Map
来自documentation的classParameterizedTypeReference<T>
The purpose of this class is to enable capturing and passing a generic Type. In order to capture the generic type and retain it at runtime, you need to create a subclass (ideally as anonymous inline class) as follows:
当您需要 serialize/deserialize 某些东西到使用泛型的类型时(例如 Map
您不能使用
response.bodyToMono(Map.class)
这样一来,spring 就不知道您想将什么类型实际放入 Map 中了。你要输入一个int吗?一个字符串?一个东西?它不知道。
因此您需要提供包含类型信息的内容。
bodyToMono(new ParameterizedTypeReference<Map<String, MyObjectDto>>() {})
ParameterizedTypeReference
是一个匿名的 class,它将为您保留您的类型信息。所以 class 就像一个容器来保存你的类型信息,因为我们将它传递给通用函数 bodyToMono 这样 spring 可以查看这个对象的内容并找出你想要使用的类型.