我开始学习HATEOAS。作为回应,我想先显示页面详细信息,然后显示页面链接,然后显示资源。不幸的是,所有内容都以相反的顺序显示。如何将“ _links {}”和“页面{}”的数据放在Json响应的开头,而不是“ _embedded {}”数据。它们总是到结尾:(
我的REST控制器:
@RestController
@RequestMapping(value = "/api")
public class WebController {
private static final int DEFAULT_PAGE_NUMBER = 0;
private static final int DEFAULT_PAGE_SIZE = 5;
@Autowired
private AlbumRepository albumRepository;
@Autowired
private AlbumModelAssembler albumModelAssembler;
@GetMapping("/test")
public ResponseEntity<PagedModel<AlbumModel>> getAllAlbums(
@PageableDefault(page = DEFAULT_PAGE_NUMBER, size = DEFAULT_PAGE_SIZE) Pageable pageable,
PagedResourcesAssembler<AlbumEntity> pagedResourcesAssembler) {
Page<AlbumEntity> albumEntities = albumRepository.findAll(pageable);
Link selfLink = new Link(ServletUriComponentsBuilder.fromCurrentRequest().build().toUriString());
PagedModel<AlbumModel> collModel = pagedResourcesAssembler.toModel(albumEntities, albumModelAssembler,selfLink);
return new ResponseEntity<>(collModel, HttpStatus.OK);
}
}
我收到以下答复:
{
"_embedded": {
"albums": [
{
"title": "Top Hits Vol 1",
"description": "Top hits vol 1. description",
"releaseDate": "10-03-1981"
},
{
"title": "Top Hits Vol 2",
"description": "Top hits vol 2. description",
"releaseDate": "10-03-1982"
},
{
"title": "Top Hits Vol 3",
"description": "Top hits vol 3. description",
"releaseDate": "10-03-1983"
},
{
"title": "Top Hits Vol 4",
"description": "Top hits vol 4. description",
"releaseDate": "10-03-1984"
},
{
"title": "Top Hits Vol 5",
"description": "Top hits vol 5. description",
"releaseDate": "10-03-1985"
}
]
},
"_links": {
"first": {
"href": "http://localhost:8080/api/test?page=0&size=5"
},
"self": {
"href": "http://localhost:8080/api/test"
},
"next": {
"href": "http://localhost:8080/api/test?page=1&size=5"
},
"last": {
"href": "http://localhost:8080/api/test?page=1&size=5"
}
},
"page": {
"size": 5,
"totalElements": 10,
"totalPages": 2,
"number": 0
}
}
答案 0 :(得分:0)
通常,RFC 8259指出以下内容:
观察到JSON解析库在是否使调用软件可见对象成员的顺序方面有所不同。行为不取决于成员顺序的实现将可以互操作,因为它们不会受到这些差异的影响。
不建议依赖于特定的给定订单结构。某些实现确实在内部使用HashMap
,但无法保留所需的顺序。
如果您将Jackson用作反序列化框架,则可以使用类似的注释
@JsonPropertyOrder({ "id", "title", "artist", "description", "releaseDate" })
public class AlbumEntity {
...
}
以所需的顺序在要返回的实体类上返回数据。我目前虽然还不知道您如何说服Spring生成HAL响应表示形式,以所需的顺序对齐元素(即_links
,embedded
,...)。
但是,即使您通过curl
调用端点,也可能会产生所需的顺序,然后将输出通过管道传输到漂亮的打印工具,例如Mac OS X系统上的json_pp
,订单再次被屏蔽,因为它不遵守给定的订单。这里的重点是,链中的每个部分都需要保留JSON文档的顺序,否则无法保证内容的顺序。