我一直在检查类似的问题,并没有找到任何答案解决我所观察到的问题。
问题是,当我检索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嵌入属性中呈现的内容。
有人有什么建议吗?我的时间和想法都快用完了,而实现客户端的团队正在等待使用超媒体内容。谢谢!
2条答案
按热度按时间ftf50wuq1#
hal说明书上说
_embedded
用于存储资源对象的数组。编辑:用自己的答案回答阿尔贝托的问题
尽管如此,如果有人能告诉我为什么在以前的实现中附加的链接没有遵循hal格式,我将不胜感激。谢谢
springhateoas定制的json序列化
RepresentationModel
哪个是的父类CollectionModel
.xesrikrc2#
在进一步阅读之后,我已经下定决心,并且我已经得出结论,在响应中发送回的正确的东西是嵌入元素中的集合。
我关注了几个参考文献:
json hal rfc草稿的第6节(这是我发现的最新版本)中有一个示例,说明请求资源列表时返回的文档,其中资源列表嵌入在嵌入元素的数组中。
在专门讨论其他编写者的集合的部分中,解释是相同的,集合的元素在嵌入的属性中返回。
因此,根据这一点,如果我将控制器更改为return collectionmodel,那么我将得到一个用hal格式化的正确内容。
代码为:
结果是:
}
尽管如此,如果有人能告诉我为什么在以前的实现中附加的链接没有遵循hal格式,我将不胜感激。谢谢