1. 前言

1.1. 迁移到 Spring HATEOAS 1.0

对于 1.0 版本,我们借此机会重新评估了为 0.x 分支所做的一些设计和包结构选择。 对此我们收到了大量的反馈,而大版本升级似乎是重构这些内容的最佳时机。spring-doc.cadn.net.cn

1.1.1. 变更内容

包结构的最大变化是由引入超媒体类型注册 API 所驱动的,旨在支持 Spring HATEOAS 中的其他媒体类型。 这导致了客户端和服务器 API(分别命名对应的包)以及 mediatype 包中的媒体类型实现的清晰分离。spring-doc.cadn.net.cn

将代码库升级到新 API 的最简单方法是使用迁移脚本。 在开始之前,我们先快速概览一下这些变更。spring-doc.cadn.net.cn

表示模型

ResourceSupport/Resource/Resources/PagedResources 这一组类的命名始终让人觉得不够恰当。 毕竟,这些类型并非真正体现资源,而是表示模型,可以丰富超媒体信息和功能。 以下是新名称与旧名称的映射关系:spring-doc.cadn.net.cn

因此,ResourceAssembler 已重命名为 RepresentationModelAssembler,其方法 toResource(…)toResources(…) 已分别重命名为 toModel(…)toCollectionModel(…)。 此外,名称变更也已反映在 TypeReferences 所包含的类中。spring-doc.cadn.net.cn

  • RepresentationModel.getLinks() 现在暴露一个 Links 实例(而非 List<Link>),因为它提供了额外的 API,可使用多种策略连接和合并不同的 Links 实例。 此外,它已转变为自绑定泛型类型,以允许添加链接到该实例的方法返回实例本身。spring-doc.cadn.net.cn

  • LinkDiscoverer API 已移至 client 包。spring-doc.cadn.net.cn

  • LinkBuilderEntityLinks API 已移至 server 包中。spring-doc.cadn.net.cn

  • ControllerLinkBuilder 已被移入 server.mvc,并标记为弃用,将由 WebMvcLinkBuilder 替代。spring-doc.cadn.net.cn

  • RelProvider 已重命名为 LinkRelationProvider,并返回 LinkRelation 实例,而非 Stringspring-doc.cadn.net.cn

  • VndError 已移至 mediatype.vnderror 包。spring-doc.cadn.net.cn

1.1.2. 迁移脚本

您可以找到一个脚本,从您的应用程序根目录运行该脚本,它将更新所有导入语句和静态方法引用,以适配在我们源代码仓库中已移动的 Spring HATEOAS 类型。 只需下载该脚本,并从您的项目根目录运行它。 默认情况下,它将检查所有 Java 源文件,并将旧的 Spring HATEOAS 类型引用替换为新的引用。spring-doc.cadn.net.cn

示例 1. 迁移脚本的示例应用程序
$ ./migrate-to-1.0.sh

Migrating Spring HATEOAS references to 1.0 for files : *.java

Adapting ./src/main/java/…
…

Done!

请注意,该脚本未必能够完全修复所有更改,但它应涵盖最重要的重构内容。spring-doc.cadn.net.cn

现在请在您喜欢的 Git 客户端中验证对文件所做的更改,并按需提交。 如果您发现未迁移的方法或类型引用,请在我们的问题跟踪器中提交工单。spring-doc.cadn.net.cn

1.1.3. 从 1.0 M3 迁移到 1.0 RC1

  • Link.andAffordance(…) 获取 Affordance 的详细信息已移至 Affordances。若要手动构建 Affordance 实例,现在请使用 Affordances.of(link).afford(…)。另请注意,Affordances 暴露了新的 AffordanceBuilder 类型以支持流式用法。详见 Affordancesspring-doc.cadn.net.cn

  • AffordanceModelFactory.getAffordanceModel(…) 现在接收 InputPayloadMetadataPayloadMetadata 实例,而非 ResolvableType,以支持非基于类型的实现。自定义媒体类型实现需相应适配。spring-doc.cadn.net.cn

  • HAL Forms 现在如果属性值符合规范中定义的默认值,将不再渲染这些属性。也就是说,如果之前 required 被显式设置为 false,我们现在会直接省略 required 的条目。 此外,我们现在仅对使用 PATCH 作为 HTTP 方法的模板强制将其设置为非必填项。spring-doc.cadn.net.cn