gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:34:21 24 4
gpt4 key购买 nike

我有一个基于 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,因为否则,您将通过向数据库发送空值来冒数据风险。

但是合并本身有点棘手,因为您需要对每个字段进行操作并决定是将新值发送到数据库还是仅保留当前值。当您添加字段时,验证需要更新,并且测试变得更加复杂。简而言之:它无法扩展。这个想法是始终编写对扩展开放并对修改关闭的代码。如果您添加更多字段,那么理想情况下验证 block 不需要更改。

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

GET /user/100

然后您的网页中就有了用户 id=100 的整个字段。然后你改变它的姓氏。您可以使用 PUT 动词调用相同的资源 URL 来传播更改:

PUT /user/100

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

关于java - Spring JPA - 实体的 RESTful 部分更新和验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55460246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com