Java Spring JPA-实体的RESTful部分更新和验证
我有一个基于SpringMVC的简单RESTfulAPI,它使用一个连接JPA的MySQL数据库。到目前为止,此API仅支持实体的完整更新。这意味着必须在请求主体内部提供所有字段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
@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服务。我基本上有两个问题:
- 如何仅验证中的“现有”属性子集 在创建过程中,仍然需要所有字段时更新方法
- 是否有一种更优雅的方法进行部分更新,然后检查 空的
GET /user/100
然后,您的网页中有用户id=100的整个字段。然后你改变它的姓。使用PUT谓词传播调用同一资源URL的更改:
PUT /user/100
然后将所有字段,或者更确切地说是“同一实体”发送回一个新的姓氏。如果你忘记了验证,验证只会像一个黑匣子一样工作。如果添加更多字段,则添加更多@NotNull或任何需要的验证。当然,在某些情况下,您可能需要实际编写代码块进行验证。即使在这种情况下,验证也不会受到影响,因为您将有一个用于验证的main for循环,并且每个字段都有自己的验证器。如果添加字段,则添加验证器,但主验证块仍不可触及。当您用@NotEmpty注释字段“title”时,这意味着您不可能有一个标题为空的文章实例。@Hua当然,这是有意的,因为不可能创建没有标题的文章。。。只要验证一个更新请求体,每个字段应该是可选的,而不是在创建期间。@ 0x1C1b请考虑接受另一个答案,它更适合于每一个好的方法!您建议如何处理用户名或标识符等不可变字段?我是否应该明确忽略这些字段?那么,使用java验证注释将使您能够执行一些基本操作,如空、空、长度验证。如果某些字段无法更新,比如用户名,那么您需要编写逻辑。这种情况是由您的内部业务或组织规则驱动的。在第一层,您将拥有所有@Valid验证。然后,代码开始执行。您可以在DAO层中使用逻辑从实体中提取当前用户名,并将其与有效负载中的用户名进行比较。这只是一个例子,有很多种方法,我真正的目标是在REST环境中指导您,当您拉动和推动整个实体以实现简单性和健壮性时。
PUT /user/100