繁体   English   中英

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

[英]Spring JPA - RESTful partial update and validation for entity

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

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

    return service.updateById(id, newArticle);
}

这里真正的问题是验证,我怎么能只验证提供的字段,而在创建过程中仍然需要所有字段?

@Entity
public class Article {

    @NotEmpty @Size(max = 100) String title;
    @NotEmpty @Size(max = 500) String content;

    // Getters and Setters
}

部分更新请求正文的示例{"content": "Just a test"}而不是{"title": "Title", "content": "Just a test"} 实际的部分更新是通过检查给定字段是否不为空来完成的:

if(newArticle.getTitle() != null) article.setTitle(newArticle.getTitle());

但是验证当然不起作用! 我必须停用更新方法的验证才能运行 RESTful 服务。 我基本上有两个问题:

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

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

但是合并本身有点棘手,因为您需要对每个字段进行操作并做出将新值发送到数据库或仅保留当前值的决定。 在添加字段时,需要更新验证,并且测试变得更加复杂。 在一个简单的声明中: 它不会缩放 想法是始终编写开放的代码以进行扩展,封闭的代码以进行修改。 如果添加更多字段,则理想情况下无需更改验证块。

在REST模型中处理此问题的方式是,每次需要时都对整个实体进行操作。 假设您有用户,然后先拉一个用户:

GET /user/100

然后,您的网页中将具有用户ID = 100的所有字段。 然后,您更改其姓氏。 您传播使用PUT动词调用相同资源URL的更改:

PUT /user/100

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

这些是实体验证的最基本选项:

  1. 您可以使用@NotNull注释列,就像使用其他约束一样。
  2. 您可以使用@Column(nullable = false)注释字段。

另一方面,@ @Valid在输入方法之前先验证对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM