TestRestTemplate调用HATEOAS API返回空Body,curl可正常获取数据
TestRestTemplate接收Spring Data REST分页数据content为空的解决方案
你遇到的问题是因为Spring Data REST返回的HAL格式分页响应中,资源列表嵌套在_embedded字段下,而直接用PagedModel<Hospital>无法正确映射这个嵌套结构,导致content为空(分页元数据在顶层,所以能正常解析)。
解决方法是使用PagedModel<EntityModel<Hospital>>作为返回类型,具体说明如下:
- 正确接收类型:
PagedModel<EntityModel<Hospital>>,其中EntityModel是Spring HATEOAS提供的包装类,专门处理带链接的HAL单个资源,PagedModel结合它就能正确解析_embedded下的资源列表。 - 请求示例代码:
// 发起请求,必须用ParameterizedTypeReference指定泛型类型 ResponseEntity<PagedModel<EntityModel<Hospital>>> response = testRestTemplate.exchange( "http://localhost:8083/hospitals?page=0&size=20", HttpMethod.GET, null, new ParameterizedTypeReference<PagedModel<EntityModel<Hospital>>>() {} ); // 提取实际的Hospital列表 PagedModel<EntityModel<Hospital>> pagedResult = response.getBody(); List<Hospital> hospitalList = pagedResult.getContent().stream() .map(EntityModel::getContent) // 从EntityModel中取出Hospital对象 .collect(Collectors.toList()); - 关键注意点:不能直接传递
PagedModel.class给exchange方法,必须用ParameterizedTypeReference保留泛型信息,否则Jackson无法正确反序列化嵌套的资源结构。
单个对象请求正常是因为单个资源的HAL响应没有_embedded嵌套,直接是EntityModel<Hospital>的结构,所以可以直接映射到EntityModel<Hospital>或者Hospital本身。
内容的提问来源于stack exchange,提问作者Dandy
相关产品推荐
相关产品推荐

