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

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

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

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

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

  1. 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方法。

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

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

  1. inline fun<T> foo(url: String, entity: HttpEntity) {
  2. return restTemplate.exchange(
  3. url,
  4. HttpMethod.GET,
  5. entity,
  6. object : ParameterizedTypeReference<PageType<SomeClass>>() {})
  7. }
展开查看全部

相关问题