springhateoas呈现hal内容的问题

lfapxunr  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(396)

我一直在检查类似的问题,并没有找到任何答案解决我所观察到的问题。
问题是,当我检索1个资源时,我很容易在restapi中获得hal格式的超媒体,但是当我点击控制器方法检索实体列表时,超媒体就不一样了。
以下是输出:
返回单个资源
"_links": { "self": { "href": "http://localhost:8080/celsvs/api/books/123567891099" }, "books": { "href": "http://localhost:8080/celsvs/api/books" } }

资源列表
"links": [ { "rel": "self", "href": "http://localhost:8080/celsvs/api/books/123567891099" }, { "rel": "books", "href": "http://localhost:8080/celsvs/api/books" } ]

我从SpringHateoas0.25开始,但是由于我不得不升级SpringBoot,我看到HateoasAPI已经改变了,我现在使用SpringHateoas1.0。。。即使在我的代码适应了新的api之后,我仍然得到了相同的结果。
我正在使用representationmodelsassemblersupport类来清除生成hateoas内容的代码中的控制器。所以它看起来是这样的: `@Component
public class BookModelAssembler extends RepresentationModelAssemblerSupport<BookDto, BookDto> {
public BookModelAssembler() {
super(BooksController.class, BookDto.class);
}
@Override
public BookDto toModel(BookDto entity) {
return entity.add(linkTo(methodOn(BooksController.class).getResource(entity.getIsbn())).withSelfRel())
.add(linkTo(methodOn(BooksController.class).getAllResources()).withRel("books"));
}

}在控制器中,用于检索一个或所有资源的端点:@Override
@GetMapping(value = {QueryConstants.BOOKS_ISBN_PATH, QueryConstants.BOOKS_SIG_PATH})
public BookDto getResource(@PathVariable("isbn") final String isbn) {

return this.modelAssembler.toModel(this.findOneResource(isbn));

}
// GET - retrieve all resources
@Override
@GetMapping (produces = { "application/hal+json" })
public List getAllResources() {

return (findAllResources().stream().map(this.modelAssembler::toModel).collect(Collectors.toList()));

}如您所见,即使返回的列表中的所有实体都使用getresource()方法中使用的同一方法tomodel()进行了Map,呈现的超媒体也是不同的。 在所有资源的情况下,我能够看到正确返回的hal格式的唯一方法是当我更改控制器的实现以返回集合模型时://@GetMapping
public CollectionModel getAll() {
return this.modelAssembler.toCollectionModel(findAllResources());
}` 但是所有的实体都捆绑在一个嵌入元素中,这不是我返回实体集合时想要的。
SpringHateOAS文档声明hal是默认的,所以我现在还没有考虑配置任何东西。。。
所以,我只看到:
我缺少一些配置,因此当我可以获得呈现的实体集合时(在嵌入元素下没有)。。。但是我还没有看到任何适合我的东西。
我假设返回请求的资源类型集合的正确方法不在\u嵌入属性中。。。但也许我错了。到目前为止,我的理解是,当你请求,比如说,资源人员,并且你想返回它的联系人,这些联系人也可以通过他们自己的端点直接访问,然后你将它们嵌入到返回的内容以及其他人员属性中。。。我没有发现任何声明集合应该在\u嵌入属性中呈现的内容。
有人有什么建议吗?我的时间和想法都快用完了,而实现客户端的团队正在等待使用超媒体内容。谢谢!

ftf50wuq

ftf50wuq1#

hal说明书上说 _embedded 用于存储资源对象的数组。
编辑:用自己的答案回答阿尔贝托的问题
尽管如此,如果有人能告诉我为什么在以前的实现中附加的链接没有遵循hal格式,我将不胜感激。谢谢
springhateoas定制的json序列化 RepresentationModel 哪个是的父类 CollectionModel .

// 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` 用于序列化逻辑。
xesrikrc

xesrikrc2#

在进一步阅读之后,我已经下定决心,并且我已经得出结论,在响应中发送回的正确的东西是嵌入元素中的集合。
我关注了几个参考文献:
json hal rfc草稿的第6节(这是我发现的最新版本)中有一个示例,说明请求资源列表时返回的文档,其中资源列表嵌入在嵌入元素的数组中。
在专门讨论其他编写者的集合的部分中,解释是相同的,集合的元素在嵌入的属性中返回。
因此,根据这一点,如果我将控制器更改为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格式,我将不胜感激。谢谢

相关问题