Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 JPA-实体的RESTful部分更新和验证_Java_Spring_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java Spring JPA-实体的RESTful部分更新和验证

Java Spring JPA-实体的RESTful部分更新和验证,java,spring,spring-boot,spring-data-jpa,Java,Spring,Spring Boot,Spring Data Jpa,我有一个基于SpringMVC的简单RESTfulAPI,它使用一个连接JPA的MySQL数据库。到目前为止,此API仅支持实体的完整更新。这意味着必须在请求主体内部提供所有字段 @ResponseBody @PutMapping(value = "{id}") public ResponseEntity<?> update(@Valid @RequestBody Article newArticle, @PathVariable("id") long id) { retu

我有一个基于SpringMVC的简单RESTfulAPI,它使用一个连接JPA的MySQL数据库。到目前为止,此API仅支持实体的完整更新。这意味着必须在请求主体内部提供所有字段

@ResponseBody
@PutMapping(value = "{id}")
public ResponseEntity<?> update(@Valid @RequestBody Article newArticle, @PathVariable("id") long id) {

    return service.updateById(id, newArticle);
}
部分更新请求正文的示例
{“content”:“Just a test”}
而不是
{“title”:“title”,“content”:“Just a test”}
。 通过检查给定字段是否不为null来完成实际的部分更新:

if(newArticle.getTitle() != null) article.setTitle(newArticle.getTitle());
但是验证当然行不通!我必须停用update方法的验证才能运行RESTful服务。我基本上有两个问题:

  • 如何仅验证中的“现有”属性子集 在创建过程中,仍然需要所有字段时更新方法
  • 是否有一种更优雅的方法进行部分更新,然后检查 空的

部分更新和Spring JPA的复杂性在于,您可能会发送已填充字段的一半,甚至需要从数据库中提取整个实体,然后只需“合并”实体和pojo,否则您将通过向数据库发送空值来冒数据风险

但是合并本身有点棘手,因为您需要对每个字段进行操作,然后决定是将新值发送到数据库,还是只保留当前值。当您添加字段时,验证需要更新,测试变得更加复杂。在一条语句中:它不可缩放。其思想是始终编写开放供扩展、封闭供修改的代码。如果添加更多字段,则验证块理想情况下不需要更改

在REST模型中处理这个问题的方法是每次需要时对整个实体进行操作。假设你有用户,那么你首先拉一个用户:

GET /user/100
然后,您的网页中有用户id=100的整个字段。然后你改变它的姓。使用PUT谓词传播调用同一资源URL的更改:

PUT /user/100

然后将所有字段,或者更确切地说是“同一实体”发送回一个新的姓氏。如果你忘记了验证,验证只会像一个黑匣子一样工作。如果添加更多字段,则添加更多@NotNull或任何需要的验证。当然,在某些情况下,您可能需要实际编写代码块进行验证。即使在这种情况下,验证也不会受到影响,因为您将有一个用于验证的main for循环,并且每个字段都有自己的验证器。如果添加字段,则添加验证器,但主验证块仍不可触及。

当您用@NotEmpty注释字段“title”时,这意味着您不可能有一个标题为空的文章实例。@Hua当然,这是有意的,因为不可能创建没有标题的文章。。。只要验证一个更新请求体,每个字段应该是可选的,而不是在创建期间。@ 0x1C1b请考虑接受另一个答案,它更适合于每一个好的方法!您建议如何处理用户名或标识符等不可变字段?我是否应该明确忽略这些字段?那么,使用java验证注释将使您能够执行一些基本操作,如空、空、长度验证。如果某些字段无法更新,比如用户名,那么您需要编写逻辑。这种情况是由您的内部业务或组织规则驱动的。在第一层,您将拥有所有@Valid验证。然后,代码开始执行。您可以在DAO层中使用逻辑从实体中提取当前用户名,并将其与有效负载中的用户名进行比较。这只是一个例子,有很多种方法,我真正的目标是在REST环境中指导您,当您拉动和推动整个实体以实现简单性和健壮性时。
PUT /user/100