springhateoas呈现hal内容的问题

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

我一直在检查类似的问题,并没有找到任何答案解决我所观察到的问题。
问题是,当我检索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) {

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

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

  1. 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 .

  1. // org.springframework.hateoas.mediatype.hal.RepresentationModelMixin
  2. public abstract class RepresentationModelMixin extends RepresentationModel<RepresentationModelMixin> {
  3. @Override
  4. @JsonProperty("_links")
  5. @JsonInclude(Include.NON_EMPTY)
  6. @JsonSerialize(using = Jackson2HalModule.HalLinkListSerializer.class)
  7. @JsonDeserialize(using = Jackson2HalModule.HalLinkListDeserializer.class)
  8. public abstract Links getLinks();
  9. }
  10. ``` `@JsonProperty("_links")` 定义要使用的json属性名 `_links` . @jsonserialize定义要使用的序列化程序。调查方法 `org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize` 用于序列化逻辑。
xesrikrc

xesrikrc2#

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

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

结果是:

  1. {
  2. "_embedded": {
  3. "bookDtoList": [
  4. {
  5. "isbn": "123567891099",
  6. "signature": "AA-23-EEE",
  7. "title": "Electromagnetismo",
  8. "subtitle": "Introducción a las aplicaciones del electromagnetismo",
  9. "authors": [
  10. "Idoia Mendieta",
  11. "Bonifacio Pérez"
  12. ],
  13. "available": false,
  14. "numOfCopies": 0,
  15. "library": null,
  16. "detailedInfo": null,
  17. "_links": {
  18. "self": {
  19. "href": "http://localhost:8080/celsvs/api/books/123567891099"
  20. },
  21. "books": {
  22. "href": "http://localhost:8080/celsvs/api/books"
  23. }
  24. }
  25. },
  26. {
  27. "isbn": "123567891012",
  28. "signature": "AA-23-EFD",
  29. "title": "Electromagnetismo",
  30. "subtitle": "Introducción a las aplicaciones del electromagnetismo",
  31. "authors": [
  32. "Idoia Mendieta",
  33. "Bonifacio Pérez"
  34. ],
  35. "available": false,
  36. "numOfCopies": 0,
  37. "library": null,
  38. "detailedInfo": null,
  39. "_links": {
  40. "self": {
  41. "href": "http://localhost:8080/celsvs/api/books/123567891012"
  42. },
  43. "books": {
  44. "href": "http://localhost:8080/celsvs/api/books"
  45. }
  46. }
  47. }
  48. ]
  49. },
  50. "_links": {
  51. "self": {
  52. "href": "http://localhost:8080/celsvs/api/books"
  53. }
  54. }

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

展开查看全部

相关问题