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>>() {})
}