【问题标题】:How to validate PATCH requests on large objects with Spring如何使用 Spring 验证对大型对象的 PATCH 请求
【发布时间】:2020-06-01 21:20:06
【问题描述】:

我似乎找不到很多关于此的信息。我读过PUT 请求应该用于用更新的资源替换整个资源,而PATCH 请求应该用于仅更新您想要更改的字段。但是,假设我有一个非常大的对象,其中包含许多嵌套字段和对象,并且我只想更新其中一个嵌套对象中的特定字段,而不必重新提交整个对象(因为它太大了)。我必须创建一个PATCH 端点。我将如何在 Spring REST API 中验证这样的端点?我无法理解端点如何知道它收到了哪些字段或嵌套字段以及如何验证它们,并让它适用于我可以给它的任何可能的字段。

【问题讨论】:

  • 你必须自己编写验证,这不是 spring 会为你做的事情

标签: spring rest spring-boot spring-mvc


【解决方案1】:

当一个请求进入spring时,它会将它转换为例如一个对象。

 @PatchMapping("/customer/1")
 public void updateCustomer(@RequestBody CustomerPatch updateRequest) {
 }

在这里,我们将客户补丁请求转换为 CustomerPatch 对象。

有了这个,我们可以像验证任何其他对象一样验证对象。

我个人将@Valid注解与hibernate验证器配对使用。

所以我的弹簧控制器看起来像。

@PatchMapping("/customer/1")
public void updateCustomer(@RequestBody @Valid CustomerPatch updateRequest) {
}

public class CustomerPatch{
    @NotNull
    String cusotmerName;
}

【讨论】:

  • 但是假设我的补丁请求是更新 Customer 对象中包含的对象内的嵌套字段。类似于 customer.nestedObject.nestedField1 的东西。在这种情况下,当它被映射到 CustomerPatch 对象时,只有 nestedField1 有一个值,而其他所有内容都可能为空。然后我怎么知道其他所有内容都为空,因为它没有在补丁请求中提供值,而不是故意设置为空?
  • 好问题,据我所知,java 中不存在这个概念。类似于 javascript 中的 undefined/null。就个人而言,当我使用 PUT 并且字段为 null 时,我会将其设置为 null,当我使用 PATCH 并且字段为 null 时,我将跳过它。
猜你喜欢
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2020-07-13
  • 2019-08-11
  • 2016-03-28
  • 1970-01-01
  • 2020-06-30
相关资源
最近更新 更多