最近在阅读Spring实战第五版中文版,书中第6章关于Spring HATEOAS部分代码使用的是Spring HATEOAS 0.25的版本,而最新的Spring HATEOAS 1.0对旧版的API做了升级,导致在使用新版Spring Boot(截至文章发布日最新的Spring Boot版本为2.2.4)加载的Spring HATEOAS 1.0.3无法正常运行书中代码,所以我决定在此对书中的代码进行迁移升级。
Spring HATEOAS 1.0 版本的变化
封装结构的最大变化是通过引入超媒体类型注册API来实现的,以支持Spring HATEOAS中的其他媒体类型。这导致客户端API和服务器API(分别命名的包)以及包中的媒体类型实现的明确分离 mediatype。
最大的变化就是将原来的资源表示为模型,具体变化如下。
在ResourceSupport/ Resource/ Resources/ PagedResources组类从来没有真正感受到适当命名。毕竟,这些类型实际上并不表示资源,而是表示模型,可以通过超媒体信息和提供的内容来丰富它们。这是新名称映射到旧名称的方式:
ResourceSupport 就是现在 RepresentationModel
Resource 就是现在 EntityModel
Resources 就是现在 CollectionModel
PagedResources 就是现在 PagedModel
因此,ResourceAssembler已被重命名为RepresentationModelAssembler和及其方法toResource(…),并分别toResources(…)被重命名为toModel(…)和toCollectionModel(…)。名称更改也反映在中包含的类中TypeReferences。
RepresentationModel.getLinks()现在公开了一个Links实例(通过List<Link>),该实例公开了其他API,以Links使用各种策略来连接和合并不同的实例。同样,它已经变成了自绑定的泛型类型,以允许向实例添加链接的方法返回实例本身。
该LinkDiscovererAPI已移动到client包。
在LinkBuilder和EntityLinksAPI已经被移到了server包。
ControllerLinkBuilder已移入server.mvc,不推荐使用替换WebMvcLinkBuilder。
RelProvider已重命名为LinkRelationProvider并返回LinkRelation实例,而不是String。
VndError已移至mediatype.vnderror套件。
更多变化请参考Spring HATEOAS文档:https://spring.io/projects/spring-hateoas
代码迁移升级
书中程序清单6.4 为资源添加超链接
复制代码
@GetMapping("/recent")
public CollectionModel<EntityModel<Taco>> recentTacos() {
PageRequest page = PageRequest.of(
0, 12, Sort.by("createdAt").descending());
List<Taco> tacos = tacoRepo.findAll(page).getContent();