【问题标题】:HATEOAS - problem with position of page links and page detailsHATEOAS - 页面链接和页面详细信息的位置问题
【发布时间】:2020-05-25 07:23:05
【问题描述】:

我开始学习 HATEOAS。作为回应,我想首先显示页面详细信息,然后是页面链接,然后是资源。不幸的是,一切都以相反的顺序显示。我怎么能把“_links {}”和“page {}”的数据放在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】:

    一般来说,RFC 8259 声明如下:

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

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

    如果你使用 Jackson 作为你的反序列化框架,你可以使用类似的注解

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

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

    但是,即使您即通过curl 调用端点,这可能会产生所需的顺序,并将输出通过管道传输到 Mac OS X 系统上的 json_pp 之类的漂亮打印工具,该顺序会再次重叠,因为它不尊重给定的顺序。这里的重点是,链中的每个部分都需要保留 JSON 文档的顺序,否则无法保证内容的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多