HATEOAS-页面链接和页面详细信息的位置问题

问题描述 投票:0回答:1

我开始学习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
    }
}
spring-hateoas hateoas
1个回答
0
投票

通常,RFC 8259声明以下内容:

JSON解析库在它们是否使调用软件可见对象成员的顺序方面存在差异。行为不取决于成员顺序的实现将可以互操作,因为它们不会受到这些差异的影响。

不建议依赖于特定的给定订单结构。某些实现确实在内部使用HashMap,但无法保留所需的顺序。

如果将Jackson用作反序列化框架,则可以使用类似的注释

@JsonPropertyOrder({ "id", "title", "artist", "description", "releaseDate" })
public class AlbumEntity {
    ...
}

以所需的顺序在您要返回的实体类上返回数据。我目前虽然不知道如何说服Spring生成HAL响应表示形式,以所需的顺序对齐元素(即_linksembedded,...)。

但是,即使您通过curl调用了一个端点,也可能会产生所需的顺序,然后将输出通过管道传输到漂亮的打印工具(如Mac OS X系统上的json_pp),该顺序又被重新排列,因为它不遵守给定的顺序。这里的要点是,链中的每个部分都需要保留JSON文档的顺序,否则无法保证内容的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.