如何将列表发布到Spring Data Rest?
如何将列表发布到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的相关内容并进行了一些示例后,我发现它的清晰架构非常适合我的需求,只是我还没有弄清楚如何发布一个列表。
如何将列表发布到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/…
如何将列表发布到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 Listcontent; 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”类是什么意思?谢谢。
如何将一个列表发布到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注释 - 但我没有收到任何答复。