restTemplate.exchange 不解组完整对象,但仅解组顶级 - 替代 restTemplate?
restTemplate.exchange does not unmarshal complete object, but only top level - alternative to restTemplate?
当我使用 restTemplate.exchange 调用 REST API 时,
当结果是一个简单的对象数组时,
...
ResponseEntity result = restTemplate.exchange(new URI(school.getUrl()) + reqMethod, HttpMethod.GET, entity, resultType);
return Arrays.asList((T[]) result.getBody());
...
一切正常。
但是当 API returns 一个更复杂的对象时,比如 PageResult,
class PageResult<T>(var count: Long, var result: List<T>
那么只有带有字段的 PageResult 会被正确解组,
"result" 本身 returns 作为 LinkedHashMap.
假设这是 "works as designed",但我希望 JSON 完全包含在该对象中,
因为 Spring Boot 也在生活的光明面、em 和 REST 方面做到这一点 :-)
我脑子里的结在哪里?
听起来您正在向交换方法发送 PageType::class.java。就像 M. Deinum 在他的评论中指出的那样,PageType::class.java 不知道结果 属性 中元素的类型,因此反序列化器不知道类型并默认为LinkedHashMap.
要解决此问题,请创建一个 ParameterizedTypeReference 并将其发送到交换方法。
restTemplate.exchange(
new URI(school.getUrl()) + reqMethod,
HttpMethod.GET,
entity,
object : ParameterizedTypeReference<PageType<SomeClass>>() {})
请注意,您不能只围绕此调用制作通用包装器,因为那样会产生相同的结果。如果有必要,使包装函数内联具体化类型,有点像这样;
inline fun<T> foo(url: String, entity: HttpEntity) {
return restTemplate.exchange(
url,
HttpMethod.GET,
entity,
object : ParameterizedTypeReference<PageType<SomeClass>>() {})
}
当我使用 restTemplate.exchange 调用 REST API 时, 当结果是一个简单的对象数组时,
...
ResponseEntity result = restTemplate.exchange(new URI(school.getUrl()) + reqMethod, HttpMethod.GET, entity, resultType);
return Arrays.asList((T[]) result.getBody());
...
一切正常。
但是当 API returns 一个更复杂的对象时,比如 PageResult,
class PageResult<T>(var count: Long, var result: List<T>
那么只有带有字段的 PageResult 会被正确解组, "result" 本身 returns 作为 LinkedHashMap.
假设这是 "works as designed",但我希望 JSON 完全包含在该对象中, 因为 Spring Boot 也在生活的光明面、em 和 REST 方面做到这一点 :-)
我脑子里的结在哪里?
听起来您正在向交换方法发送 PageType::class.java。就像 M. Deinum 在他的评论中指出的那样,PageType::class.java 不知道结果 属性 中元素的类型,因此反序列化器不知道类型并默认为LinkedHashMap.
要解决此问题,请创建一个 ParameterizedTypeReference 并将其发送到交换方法。
restTemplate.exchange(
new URI(school.getUrl()) + reqMethod,
HttpMethod.GET,
entity,
object : ParameterizedTypeReference<PageType<SomeClass>>() {})
请注意,您不能只围绕此调用制作通用包装器,因为那样会产生相同的结果。如果有必要,使包装函数内联具体化类型,有点像这样;
inline fun<T> foo(url: String, entity: HttpEntity) {
return restTemplate.exchange(
url,
HttpMethod.GET,
entity,
object : ParameterizedTypeReference<PageType<SomeClass>>() {})
}