Spring Hateoas 渲染 HAL 内容的问题

Spring Hateoas issues rendering HAL content

我一直在检查类似的问题,但没有找到任何解决我所观察到的问题的答案。

问题是,当我检索 1 个资源时,我很容易设法在我的 REST API 中获得 HAL 格式的超媒体,但是当我点击控制器方法检索实体列表时,然后是超媒体不一样。

输出如下:

HAL specification表示属性_embedded用于存放资源对象数组

编辑: 在他自己的回答中回答阿尔贝托的问题

Still, if someone can tell me why in the previous implementation the attached links did not follow the HAL format, I would appreciate. Thanks

Spring HATEOAS 自定义 JSON RepresentationModel 的序列化,RepresentationModelCollectionModel 的父 class。

// org.springframework.hateoas.mediatype.hal.RepresentationModelMixin
public abstract class RepresentationModelMixin extends RepresentationModel<RepresentationModelMixin> {

    @Override
    @JsonProperty("_links")
    @JsonInclude(Include.NON_EMPTY)
    @JsonSerialize(using = Jackson2HalModule.HalLinkListSerializer.class)
    @JsonDeserialize(using = Jackson2HalModule.HalLinkListDeserializer.class)
    public abstract Links getLinks();
}

@JsonProperty("_links") 将 JSON 属性 名称定义为 _links。 @JsonSerialize 定义要使用的序列化程序。查看序列化逻辑的方法 org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize

经过更多阅读,我下定决心并得出结论,在响应中发回的正确内容是 _embedded 元素中的集合。

我关注了几个参考资料:

  • JSON HAL rfc draft 的第 6 节(这是我找到的最新版本),有一个文档示例 returned 作为资源列表请求的结果,它们的列表嵌入在 _embedded 元素内的数组中。
  • 在其他作者专门针对 Collections 的部分中,解释是相同的,并且集合的元素 returned 在 _embedded 属性 中。

因此与此一致,如果我将控制器更改为 return CollectionModel,那么我将获得在 HAL 中格式化的正确内容。

代码为:

@GetMapping 
public CollectionModel<BookDto> getAll() {
    
    return this.modelAssembler.toCollectionModel(findAllResources()).add(linkTo(methodOn(BooksController.class).getAll()).withSelfRel());
}

结果是:

{
"_embedded": {
    "bookDtoList": [
        {
            "isbn": "123567891099",
            "signature": "AA-23-EEE",
            "title": "Electromagnetismo",
            "subtitle": "Introducción a las aplicaciones del electromagnetismo",
            "authors": [
                "Idoia Mendieta",
                "Bonifacio Pérez"
            ],
            "available": false,
            "numOfCopies": 0,
            "library": null,
            "detailedInfo": null,
            "_links": {
                "self": {
                    "href": "http://localhost:8080/celsvs/api/books/123567891099"
                },
                "books": {
                    "href": "http://localhost:8080/celsvs/api/books"
                }
            }
        },
        {
            "isbn": "123567891012",
            "signature": "AA-23-EFD",
            "title": "Electromagnetismo",
            "subtitle": "Introducción a las aplicaciones del electromagnetismo",
            "authors": [
                "Idoia Mendieta",
                "Bonifacio Pérez"
            ],
            "available": false,
            "numOfCopies": 0,
            "library": null,
            "detailedInfo": null,
            "_links": {
                "self": {
                    "href": "http://localhost:8080/celsvs/api/books/123567891012"
                },
                "books": {
                    "href": "http://localhost:8080/celsvs/api/books"
                }
            }
        }
    ]
},
"_links": {
    "self": {
        "href": "http://localhost:8080/celsvs/api/books"
    }
}

}

不过,如果有人能告诉我为什么在以前的实现中附加链接不遵循 HAL 格式,我将不胜感激。谢谢