Spring Boot 数据休息后实体

Posted

技术标签:

【中文标题】Spring Boot 数据休息后实体【英文标题】:Spring boot data rest post entity 【发布时间】:2018-06-03 05:00:06 【问题描述】:

我有一个带有以下方法的弹簧 RepositoryRestController:

@RequestMapping(method = RequestMethod.POST, value = "/doSomethingWithEntity")
    public @ResponseBody ResponseEntity deleteEmployeeSalaryPosition(@RequestBody Resource<Entity> entity)

我想将现有实体发布到此端点。

例如 Entity 类如下所示:

public Entity 
Long id;

String firstField;

String secondField;

EntityB relatedEntity;


将以下 JSON 发布到端点


  id: 1,
  firstField: "someThing",
  secondField: "BUMP",
  relatedEntity: "<root>/api/entityB/1:

将导致端点反序列化为实体的实例,其字段中具有以下值

Entity:
  id = null
  firstfield = "someThing"
  secondField = "BUMP",
  relatedEntity = instance of EntityB.class with everything related

我的期望是:

Entity:
  id = 1
  firstfield = "someThing"
  secondField = "BUMP",
  relatedEntity = instance of EntityB.class with everything related

问题是如何用值填充 id?

我尝试了 _links[self, entity...] 的所有组合。

【问题讨论】:

【参考方案1】:

一般来说,很多 java-ish 框架不会绑定在 JSON 中传递的 id。通常 id 在路径中。您想传递 id 然后在存储库中查找它。

看起来 RepositoryRestController delete 应该使用 HTTP DELETE 调用,路径中的 id 为:https://docs.spring.io/spring-data/rest/docs/1.0.x/api/org/springframework/data/rest/webmvc/RepositoryRestController.html

但无论如何,对于您的示例,您希望将 id 放在路径中:

@RequestMapping(method = RequestMethod.POST, value = "/doSomethingWithEntity/id")
@ResponseBody
    public ResponseEntity deleteEmployeeSalaryPosition(@PathVariable Long id, @RequestBody Resource<Entity> entity) 

根据该方法的作用,您可能根本不需要传递请求正文。

【讨论】:

这是正确的。但是,如果我们遵循这样的想法,即在客户端没有 id 只暴露自己的 url。你知道如何说服弹簧靴帮我从关系中恢复吗? 这看起来相关:***.com/questions/24936636/… 反之亦然,exposingIds 用于发送给客户端,但我想要实现的是从带有 id 的 JSON 反序列化对象。

以上是关于Spring Boot 数据休息后实体的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot数据休息时间戳解析错误

spring boot 生成错误的sql代码

带有 FeignClient 的 Spring Boot RepositoryRestResource

独立休息服务的Spring Boot安全性[重复]

Spring Boot 休息忽略一类

在 Spring Boot 应用程序中找不到类型现金流的属性日期