如何将列表发布到Spring Data Rest?

9 浏览
0 Comments

如何将列表发布到Spring Data Rest?

我按照这个例子进行操作,允许发布一个唯一的Person对象。我想要一个REST服务,可以一次性发布一组Person,例如一个名为Team的列表/任意集合,其中包含多个Person对象,只需一次调用。

我的问题并不是关于OneToMany关系,其中您在REST请求中发送每个人。这个主题已经得到了很好的回答

我想要发送一个Person对象的集合,利用@RepositoryRestResource或者Spring Data Rest的其他功能。Spring Data Rest是否支持这样做,还是我需要通过创建一个控制器,接收列表并解析Team列表来插入每个Person

我找到了这个特性请求,似乎回答了现在Spring Rest Data缺少我所寻找的内容,但我不确定。

根据我的业务需求,应用程序A将向应用程序B发布一系列订单,并且我必须将其保存在数据库中以供将来处理。因此,在阅读了关于Spring Data Rest的相关内容并进行了一些示例后,我发现它的清晰架构非常适合我的需求,只是我还没有弄清楚如何发布一个列表。

0
0 Comments

如何将列表发布到Spring Data Rest?

问题的原因是我尝试使用List<Resource<MyPojo>>。当请求体不包含任何链接时,它可以正常工作,但是如果元素包含链接,服务器无法反序列化请求体。然后我尝试使用Resources<MyPojo>,但是我无法确定列表的默认名称。最后,我尝试使用一个包含List<Resource<MyPojo>>的包装器,它可以正常工作。

以下是我的解决方案:

首先为List<Resource<MyPojo>>创建一个包装类:

public class Bulk<T> {
    private List<Resource<T>> bulk;
    // getter and setter
}

然后在参数中使用Resource<Bulk<MyPojo>>。

最后,示例JSON如下,其中包含链接以创建批量数据:

{

"bulk": [

{

"title": "Spring in Action",

"author": "http://localhost:8080/authors/1"

},

{

"title": "Spring Quick Start",

"author": "http://localhost:8080/authors/2"

}

]

}

这应该是可以接受的答案,对我帮助很大。作为将来的参考:

- 关于Resources<MyPojo>,我尝试了"content"(因为它是类代码中列表的名称)和"entities",但都没有成功:反序列化后的内容列表始终为空(我现在没有时间深入研究)。

- 关于List<Resource<MyPojo>>,你将得到类似于JSON解析错误的异常:无法构造MyPojo的实例(尽管至少存在一个构造器):没有从String值('/my-link')反序列化的String参数构造器/工厂方法。

Resource现在是EntityModel,请参阅这里:docs.spring.io/spring-hateoas/docs/current/reference/html/…

0
0 Comments

如何将列表发布到Spring Data Rest?

问题原因:Spring Data Rest中似乎还没有公开发布“Person”集合的功能。

解决方法:根据用户“user1685095”的回答,可以创建自定义控制器“PersonRestController”,并将“Person”集合的发布暴露出来。

代码如下:

import org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler;
import org.springframework.data.rest.webmvc.RepositoryRestController;
import org.springframework.hateoas.Resources;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RepositoryRestController
@RequestMapping("/persons")
public class PersonRestController {
    private final PersonRepository repo;
    public PersonRestController(PersonRepository repo) {
        this.repo = repo;
    }
    @PostMapping(value = "/batch", consumes = "application/json", produces = "application/json")
    public ResponseEntity savePersonList(@RequestBody Resource> personWrapper,
                                            PersistentEntityResourceAssembler assembler) {
        Resources resources = new Resources<>(repo.save(personWrapper.getContent().getContent()));
        //TODO add extra links `assembler`
        return ResponseEntity.ok(resources);
    }
}

更新:

public class PersonWrapper {
    private List content;
    public List getContent() {
        return content;
    }
    public void setContent(List content) {
        this.content = content;
    }
}
public class Person {
    private String name;
    private String email;
    // Other fields
    // GETTER & SETTER
}

请问“Wrapper”类是什么意思?谢谢。

0
0 Comments

如何将一个列表发布到Spring Data Rest?

在Spring Data Rest中,据我所知,你不能这样做,只需阅读文档,你就会发现,没有提到如何将列表发布到集合资源。

我不清楚这个原因,但有一个原因是,REST本身并没有真正指定你应该如何执行批量操作。

因此,如何处理这个功能是不清楚的,比如你应该将列表发布到集合资源吗?或者是否应该导出资源像/someentity/batch,它能够在一个批次中进行补丁、删除和添加实体?如果你添加列表,你应该如何返回ID?对于单个POST到集合,spring-data-rest在Location头中返回ID。对于批量添加,这是不可能的。

这并不能证明spring-data-rest缺少批量操作。他们应该实现这个,但至少可以帮助理解为什么他们缺少这个功能。

不过,我可以说的是,你总是可以为项目添加自己的控制器,以正确处理/someentity/batch,并且你甚至可能将其制作成一个库,以便在其他项目中使用。或者甚至分叉spring-data-rest并添加这个功能。尽管我试图理解它的工作原理,但迄今为止未能成功。

但你可能已经知道所有这些了,对吧?

这是一个功能请求

我将把你的答案视为最终答案:“Spring Data Rest不能用来接收列表”。显然,我尊重这个答案,但对我来说,如果Spring Data Rest能够接收列表并插入到数据库中,它将更加有用。当然,我可以在没有Spring Data Rest的情况下完成这个。只需创建一个带有List<myPojo>的控制器,然后将所有的pojo添加到数据库中。尽管如此,如果我能够将一个列表发布到我的服务中,我会经常使用Spring Data Rest。

是的,我也是这样。在他们的JIRA中,我认为有一个关于批量操作的问题。我试图创建另一个问题 - SDR不支持OrderColumn注释 - 但我没有收到任何答复。

0