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

我遵循了这个例子,它允许发布一个唯一的对象。我想要一个REST服务,我可以在其中一次发布一个集合,例如,一个列表/任何集合,只需一次调用即可命名多个对象。PersonPersonTeamPerson

我的意思是,我的问题并不完全是关于关系的,你向每个人发送REST请求。这个话题得到了很好的回答OneToMany

我想发送一个对象集合,利用Spring Data Rest或其他功能。这是否可以通过Spring Data Rest来实现,或者我应该通过创建一个控制器,接收列表并解析列表以插入每个?Person@RepositoryRestResourceTeamPerson

我发现了这个功能请求,它似乎回答了现在Spring Rest Data缺少我正在寻找的东西,但我不确定。

在我的业务需求中,应用程序A会向应用程序B发布订单列表,我必须将其保存在数据库中以供将来处理,因此,在阅读了有关Spring Data Rest并制作了一些示例之后,我发现它的干净架构令人惊叹,非常适合我的需求,除了我不知道如何发布列表的事实。


答案 1

好吧,AFAIK你不能用春季数据休息来做到这一点,只需阅读文档,你就会发现,没有提到将列表发布到集合资源。

我不清楚其中的原因,但首先 - REST本身并没有真正指定您应该如何执行批处理操作。因此,目前还不清楚应该如何处理该功能,例如是否应该将列表发布到集合资源?或者,您应该像这样导出资源,以便能够在一个批处理中修补,删除和添加实体?如果要添加列表,应如何返回 id?对于单个 POST 以在位置标头中收集 spring-data-rest 返回 ID。对于批量添加,这无法完成。/someentity/batch

这并不能证明spring-data-rest缺少批处理操作。他们应该实现这个恕我直言,但至少它可以帮助理解为什么他们错过了它。

不过,我能说的是,你总是可以把自己的控制器添加到项目中,以正确处理/someentity/batch,你甚至可以从中制作一个库,这样你就可以在另一个项目中使用它。或者甚至分叉弹簧数据休息并添加此功能。虽然我试图理解它是如何工作的,但到目前为止都失败了。但你可能知道这一切,对吧?

对此有一个功能请求


答案 2

基于user1685095的答案,您可以创建自定义控制器并公开帖子,因为它似乎尚未由PersonRestControllercollection of PersonSpring-date-rest

@RepositoryRestController
@RequestMapping(value = "/persons")
public class PersonRestController {
private final PersonRepository repo;
@Autowired
public AppointmentRestController(PersonRepository repo) {
    this.repo = repo;
}

@RequestMapping(method = RequestMethod.POST, value = "/batch", consumes = "application/json", produces = "application/json")
public @ResponseBody ResponseEntity<?> savePersonList(@RequestBody Resource<PersonWrapper<Person>> personWrapper,
        PersistentEntityResourceAssembler assembler) {
    Resources<Person> resources = new Resources<Person>(repo.save(personWrapper.getContent()));
    //TODO add extra links `assembler`
    return ResponseEntity.ok(resources);
}

}

要修复的人员包装器

无法反序列化 org.springframework.hateoas.Resources 的实例,START_ARRAY个 token\n 位于 [来源:java.io.PushbackInputStream@3298b722;行:1,列:1]

更新

public class PersonWrapper{
 private List<Person> content;
   
public List<Person> getContent(){
return content;
}

public void setContent(List<Person> content){
this.content = content;
}
}

public class Person{
private String name;
private String email;
// Other fields

// GETTER & SETTER 
}