spring hateoas通过representationmodel封装资源并自动生成hal格式链接,提升api自描述性与可演进性;支持类型安全链接构建、动态状态关联操作链接及语义化扩展。

在 REST 接口开发中使用 Spring HATEOAS,核心是让每个资源响应自带可操作的链接(links),而不是让客户端硬编码 URL。它不增加接口复杂度,但显著提升 API 的自描述性、可发现性和长期演进能力。
定义资源模型并继承 RepresentationModel
Spring HATEOAS 推荐用 RepresentationModel(或其子类如 EntityModel、CollectionModel)封装业务数据,而非直接返回原始实体。
- 创建资源类时,继承
RepresentationModel<yourresourceclass></yourresourceclass>,例如:public class BookResource extends RepresentationModel<bookresource> { ... }</bookresource> - 这样自动获得
add(Link...)方法,方便注入超媒体链接 - 若需嵌套资源(如订单含多个商品),可用
CollectionModel<entitymodel>></entitymodel>组织结构
用 ControllerLinkBuilder 生成类型安全链接
避免拼接字符串 URL,Spring 提供基于控制器方法的静态链接构建方式,支持编译期检查和重构安全。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用
linkTo(methodOn(BookController.class).getBookById(1L)).withSelfRel()生成 self 链接 - 用
slash("books").slash(1L).withRel("book")构建非控制器路径链接(如关联资源) - 支持动态参数:用
methodOn(...).search(null)占位,再通过.expand(Map.of("q", "spring"))补全
统一返回 HAL 格式并启用自动链接注入
Spring HATEOAS 默认输出 HAL(application/hal+json),需确保配置正确并启用自动资源装配。
- 在
application.properties中添加:spring.hateoas.use-hal-as-default-json-media-type=true - 添加依赖:
spring-boot-starter-hateoas(Spring Boot 2.6+ 已内置) - 控制器方法返回
EntityModel<book></book>或CollectionModel<entitymodel>></entitymodel>,框架会自动注入_links字段 - 如需自定义链接关系名,可用
@Relation(collectionRelation = "books", itemRelation = "book")注解实体类
按业务语义添加操作型链接(非仅 self)
HATEOAS 的价值不仅在于“我能访问自己”,更在于“接下来我能做什么”。比如订单状态变化时,只暴露当前合法操作。
- 根据资源状态动态添加链接:
若订单为PROCESSING,添加cancel和payment链接;若已SHIPPED,则只保留track - 用
Link.of("/orders/12345", "cancel").withType("application/json").withTitle("取消订单")增强语义 - 配合 HTTP 方法提示(虽非 HAL 标准,但可通过扩展字段或自定义 media type 支持)










