restemplate.exchange不解封完整的对象,而只解封顶级的restemplate替代品?

qnzebej0  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(393)

当我使用restemplate.exchange调用RESTAPI时,当结果是一个简单的对象数组时,

...
ResponseEntity result = restTemplate.exchange(new URI(school.getUrl()) + reqMethod, HttpMethod.GET, entity, resultType);
return Arrays.asList((T[]) result.getBody());
...

一切都好。
但是当api返回一个更复杂的对象时,比如pageresult,

class PageResult<T>(var count: Long, var result: List<T>

然后只有pageresult及其字段将被正确地解组,“result”本身作为linkedhashmap返回。
假设这是“按设计工作”,但我希望json完全包含在该对象中,因为SpringBoot在生活的其他方面也会这样做:-)
我头上的结在哪里?

bvk5enib

bvk5enib1#

听起来像是在向exchange方法发送pagetype::class.java。像m。deinum在其注解pagetype::class.java中声明,不知道result属性中元素的类型,因此反序列化程序不知道类型,并默认为linkedhashmap。
要解决此问题,请创建一个ParameteredTypeReference并将其发送到exchange方法。

restTemplate.exchange(
    new URI(school.getUrl()) + reqMethod, 
    HttpMethod.GET, 
    entity,
    object : ParameterizedTypeReference<PageType<SomeClass>>() {})

请注意,不能仅围绕此调用创建一个通用 Package 器,因为这样会产生相同的结果。如果有必要的话,让 Package 器函数内联具体化类型,有点像这样;

inline fun<T> foo(url: String, entity: HttpEntity) {
return restTemplate.exchange(
        url, 
        HttpMethod.GET, 
        entity,
        object : ParameterizedTypeReference<PageType<SomeClass>>() {})
}

相关问题