我有一个基于弹簧MVC的简单回复API,使用JPA连接的MySQL数据库。到目前为止,此 API 仅支持实体的完整更新。这意味着必须在请求正文中提供所有字段。@ResponseBody@PutMapping(value = "{id}")public ResponseEntity<?> update(@Valid @RequestBody Article newArticle, @PathVariable("id") long id) { return service.updateById(id, newArticle);}这里真正的问题是验证,我如何在创建过程中仍然需要所有字段时仅验证提供的字段?@Entitypublic 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 服务。我基本上有两个问题:如何在更新方法中仅验证属性的“现有”子集,同时在创建过程中仍需要所有字段?有没有一种更优雅的方法来部分更新,然后检查空值?
1 回答
ABOUTYOU
TA贡献1812条经验 获得超5个赞
部分更新和Spring JPA的复杂性在于,您可能会发送填充的一半字段,甚至您需要从数据库中提取整个实体,然后只需“合并”实体和pojo,因为否则您将通过向数据库发送空值来冒险。
但是合并本身有点棘手,因为您需要对每个字段进行操作,并决定是将新值发送到数据库还是仅保留当前值。添加字段时,需要更新验证,并且测试变得更加复杂。在一句话中:它不会扩展。这个想法是始终编写对扩展开放且对修改关闭的代码。如果添加更多字段,则理想情况下不需要更改验证块。
在 REST 模型中处理此问题的方式是,每次需要时对整个实体进行操作。假设你有用户,然后你首先拉一个用户:
GET /user/100
然后,您在网页中拥有用户ID = 100的整个字段。然后你改变它的姓氏。使用 PUT 谓词调用相同的资源 URL 来传播更改:
PUT /user/100
然后你发送所有的字段,或者更确切地说,“同一实体”用一个新的姓氏回来。你忘记了验证,验证将只作为一个黑匣子工作。如果添加更多字段,则会添加更多@NotNull或所需的任何验证。当然,在某些情况下,您可能需要实际编写代码块以进行验证。即使在这种情况下,验证也不会受到影响,因为您将有一个用于验证的主for循环,并且每个字段都有自己的验证器。如果添加字段,则会添加验证程序,但主验证块仍然不可触及。
添加回答
举报
0/150
提交
取消