Spring Hateoas 使用RestTemplate消费接口时content始终为空如何解决
问题根因
默认RestTemplate没有集成Spring HATEOAS的HAL格式序列化支持,无法将返回报文中_embedded节点下的内容正确映射到PagedModel的content属性,因此会出现元数据和状态码正常,但集合内容为空的情况。
解决步骤
- 第一步:消费端引入Spring HATEOAS依赖,Spring Boot项目直接引入对应starter即可:
<!-- Maven 依赖配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-hateoas</artifactId> </dependency>
- 第二步:为RestTemplate注册HATEOAS消息转换器,使用Spring官方提供的配置器自动适配HAL格式,无需手动处理Jackson模块注册逻辑:
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(HypermediaRestTemplateConfigurer configurer) { RestTemplate restTemplate = new RestTemplate(); // 自动注入HATEOAS支持的消息转换器,适配HAL JSON格式 configurer.configure(restTemplate); return restTemplate; } }
- 第三步:在
Content实体类上添加关系注解,和返回报文中_embedded下的集合键名匹配:
import org.springframework.hateoas.server.core.Relation; @Relation(collectionRelation = "contents", itemRelation = "content") public class Content { // 原有实体属性和方法保持不变 }
- 可选手动配置方案:如果需要自定义ObjectMapper,可手动注册HATEOAS的HAL模块:
ObjectMapper halObjectMapper = Jackson2ObjectMapperBuilder.json() .modules(new Jackson2HalModule()) .handlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator( new DefaultRelProvider(), null, null)) .build(); // 将配置好的ObjectMapper绑定到消息转换器,加入RestTemplate的转换器列表即可
补充说明:请确保服务提供端和消费端的Spring HATEOAS版本尽量保持一致,避免版本差异导致的序列化规则不兼容问题
内容的提问来源于stack exchange,提问作者Mulgard
相关产品推荐
相关产品推荐

