Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Hateoas问题:呈现HAL内容_Java_Spring_Spring Mvc_Spring Hateoas_Hateoas - Fatal编程技术网

Java Spring Hateoas问题:呈现HAL内容

Java Spring Hateoas问题:呈现HAL内容,java,spring,spring-mvc,spring-hateoas,hateoas,Java,Spring,Spring Mvc,Spring Hateoas,Hateoas,我一直在检查类似的问题,没有找到任何解决我所观察到的问题的答案 问题是,当我检索1个资源时,我很容易在RESTAPI中获得HAL格式的超媒体,但当我点击控制器方法检索实体列表时,超媒体就不同了 以下是输出: 返回的单个资源 “_链接”:{ “自我”:{ “href”:”http://localhost:8080/celsvs/api/books/123567891099" }, “书籍”:{ “href”:”http://localhost:8080/celsvs/api/books" }

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

问题是,当我检索1个资源时,我很容易在RESTAPI中获得HAL格式的超媒体,但当我点击控制器方法检索实体列表时,超媒体就不同了

以下是输出:

  • 返回的单个资源

    “_链接”:{ “自我”:{ “href”:”http://localhost:8080/celsvs/api/books/123567891099" }, “书籍”:{ “href”:”http://localhost:8080/celsvs/api/books" } }

  • 资源清单

    “链接”:[ { “rel”:“self”, “href”:”http://localhost:8080/celsvs/api/books/123567891099" }, { “rel”:“书籍”, “href”:”http://localhost:8080/celsvs/api/books" } ]

我从Spring hateoas 0.25开始,但由于我必须升级Spring boot,我看到hateoas API已经更改,我现在使用Spring hateoas 1.0。。。即使在我的代码适应了新的API之后,我仍然得到了相同的结果

我正在使用RepresentationModelAssemblerSupport类来保持我的控制器与生成hateoas内容的代码的一致性。这就是它的样子:


@组件
公共类BookModelAssembler扩展了RepresentationModelAssembler支持{
公共BookModelAssembler(){
super(BooksController.class、BookDto.class);
}
@凌驾
公共簿记到toModel(簿记到实体){
返回entity.add(linkTo(methodOn(BooksController.class).getResource(entity.getIsbn()).withSelfRel())
.add(linkTo(methodOn(BooksController.class).getAllResources()).withRel(“books”);
}
}
在控制器中,用于检索一个或所有资源的端点:


@覆盖
@GetMapping(值={QueryConstants.BOOKS\u ISBN\u PATH,QueryConstants.BOOKS\u SIG\u PATH})
public BookDto getResource(@PathVariable(“isbn”)最终字符串isbn){
返回this.modelsembler.toModel(this.findOneResource(isbn));
}
//获取-检索所有资源
@凌驾
@GetMapping(products={“application/hal+json”})
公共列表getAllResources(){
return(findAllResources().stream().map(this.modelsassembler::toModel).collect(Collectors.toList());
}
如您所见,即使返回的列表中的所有实体都使用方法getResource()中使用的同一方法toModel()进行了映射,呈现的超媒体也是不同的

在所有资源的情况下,我能够看到正确返回的HAL格式的唯一方法是当我更改控制器的实现以返回集合模型时:


/@GetMapping
公共集合模型getAll(){
返回这个.modelsembler.toCollectionModel(findAllResources());
}
但是所有的实体都捆绑在一个_嵌入元素中,这不是我返回实体集合时想要的

SpringHateoas文档声明HAL是默认的,所以我现在还没有考虑过配置任何东西

所以,我只看到:

  • 我缺少一些配置,因此当我可以获得渲染的实体集合时(在_嵌入元素下为否)。。。但我还没有看到任何适合Halbean的配置
  • 我假设返回所请求资源类型集合的正确方法不在_embedded属性中。。。但也许我错了。到目前为止,我的理解是,当你请求,比如说,资源人员,并且你想要返回它的联系人时,这些联系人也可以通过他们自己的端点直接访问,然后你将这些联系人与其他人员属性一起嵌入返回的内容中。。。我没有发现任何声明集合应该在_embedded属性中呈现的内容
有人有什么建议吗?我的时间和想法都快用完了,而实现客户端的团队正在等待消费超媒体内容。 谢谢

表示属性
\u embedded
用于存储资源对象的数组

编辑: 用自己的答案回答阿尔贝托的问题

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

Spring HATEOAS定制
RepresentationModel
的JSON序列化,它是
CollectionModel
的父类

//org.springframework.hateoas.mediatype.hal.RepresentationModelMixin
公共抽象类RepresentationModelMixin扩展了RepresentationModel{
@凌驾
@JsonProperty(“\u链接”)
@JsonInclude(Include.NON_EMPTY)
@JsonSerialize(使用=Jackson2HalModule.HalLinkListSerializer.class)
@JsonDeserialize(使用=Jackson2HalModule.HalLinkListDeserializer.class)
公共抽象链接getLinks();
}

@JsonProperty(“\u links”)
将JSON属性名称定义为
\u links
@JsonSerialize定义要使用的序列化程序。查看方法
org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize
,了解序列化逻辑。

在进一步阅读之后,我下定了决心,并得出结论,在响应中返回的正确内容是_嵌入元素中的集合

我遵循了几条参考文献:

  • 的第6节(这是我发现的最新版本),有一个示例,说明请求资源列表时返回的文档,其中资源列表嵌入在_嵌入元素内的数组中
  • 在其他作者专门介绍的部分中,解释是相同的,集合的元素在_嵌入的属性中返回
因此,根据这一点,如果我将控制器更改为返回CollectionModel,那么我将得到一个正确的内容格式
@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<BookDto> getAllResources() {
    
    return (findAllResources().stream().map(this.modelAssembler::toModel).collect(Collectors.toList()));
}
//@GetMapping
public CollectionModel<BookDto> getAll() {
        return this.modelAssembler.toCollectionModel(findAllResources());
}
@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"
    }
}