我花了几天时间研究如何实现一个Spring REST API,其中包含HATEOAS链接+使用Sping Boot 和JPA(无Spring Data 休息)进行分页,就像下面这个随机示例:
{
"_links": {
"first": {
"href": "http://localhost:8080/api/albums-list?page=0&size=2&sort=title,desc"
},
"prev": {
"href": "http://localhost:8080/api/albums-list?page=0&size=2&sort=title,desc"
},
"self": {
"href": "http://localhost:8080/api/albums-list?page=1&size=2&sort=title,desc"
},
"next": {
"href": "http://localhost:8080/api/albums-list?page=2&size=2&sort=title,desc"
},
"last": {
"href": "http://localhost:8080/api/albums-list?page=4&size=2&sort=title,desc"
}
},
"page": {
"size": 2,
"totalElements": 10,
"totalPages": 5,
"number": 1
},
"_embedded": {
"albums": [
{
"id": 7,
"title": "Top Hits Vol 7",
"description": "Top hits vol 7. description",
"releaseDate": "10-03-1987",
"actors": [
{
"id": 4,
"firstName": "Janice",
"lastName": "Preston",
"_links": {
"self": {
"href": "http://localhost:8080/api/actors/4"
}
}
}
],
"_links": {
"self": {
"href": "http://localhost:8080/api/actors/7"
}
}
},
{
"id": 6,
"title": "Top Hits Vol 6",
"description": "Top hits vol 6. description",
"releaseDate": "10-03-1986",
"actors": [
{
"id": 3,
"firstName": "Laverne",
"lastName": "Mann",
"_links": {
"self": {
"href": "http://localhost:8080/api/actors/3"
}
}
}
],
"_links": {
"self": {
"href": "http://localhost:8080/api/actors/6"
}
}
}
]
}
}
然而,到目前为止,我发现的解决方案复杂得可笑,或者样板文件的数量可笑。例如,这个解决方案:https://howtodoinjava.com/spring5/hateoas/pagination-links/页面上的教程没有完整地介绍它,但它要求您创建实体、实体的模型和充满样板文件的长RepresentationModelAssemblerSupport
我也试过这个:https://spring.io/guides/tutorials/rest/但是嵌套类(i具有一对多/多对一的关系)没有获得HATEOAS的链接:
{
"id": 3,
"nome": "Amazonas",
"uf": "AM",
"cidades": [
{
//no HATEOAS in here
"id": 10003,
"nome": null,
"instituicoes": [],
"uf": "AM"
},
{
"id": 219,
"nome": "Alvarães",
"instituicoes": [],
"uf": "AM"
}
],
"_links": {
"self": {
"href": "http://localhost:8080/api/v1/estados/estadoes/3"
},
"estadoes": {
"href": "http://localhost:8080/api/v1/estados/estadoes"
}
}
}
我的意思是,难道没有更简单的解决方案吗?幸运的是,分页和排序仓库是有用的,但同时拥有分页+ HATEOAS,真是一场噩梦。
2条答案
按热度按时间3htmauhk1#
RepresentationModelAssembler
是必需的。如果不需要其他字段,则模型类extends EntityModel<T>
是不必要的。我的示例实体类是
Inventory
。RepresentationModelAssembler。您可以在此处添加更多链接。
主计长
HAL JSON响应。一个完整的长响应可以在我的HTML doc中找到。下载它并用浏览器打开。
完整的代码在Github中共享,如果我的项目除了这个答案之外还有帮助,可以考虑在Github中给予它一颗星星。
hgqdbh6s2#
在这个例子中有一个很好的解释,代码分页(使用Hateoas),使用Sping Boot 和JPA进行过滤和排序。演示了多种方法。这正好涵盖了实现分页的方法,包括没有Spring Data 休息的排序和过滤。