【问题标题】:REST Standards: Can the same Request Object used for POST & PUT requests?REST 标准:可以将相同的请求对象用于 POST 和 PUT 请求吗?
【发布时间】:2019-11-17 14:56:24
【问题描述】:

说,这些是以下 POST & PUT 请求

@PostMapping(value = "/")
public ResponseEntity<CustomResponse<EntityExchange>> createEntity(@Valid @RequestBody EntityExchange entityExchange)
@PutMapping(value = "/{id}")
public ResponseEntity<CustomResponse<EntityExchange>> updateEntity(@Valid @RequestBody EntityExchange entityExchange)

上述请求使用相同的 Exchange 对象,但对于验证字段,例如,“自定义字段”在 POST 请求中可以为空,而它应该出现在 PUT 请求中。我可以为 POST 和 PUT 分别创建两个交换,但是有没有更好的方法来重用交换对象但也有字段验证?

请注意,我使用了“Exchange”术语,因为请求和响应都属于同一模型。

【问题讨论】:

  • 通常情况下,PUTs 预计会在/{id}/ 发生-无论如何,您都应该将实现约束与 API 设计分离...
  • @ernest_k 谢谢,最初的问题实际上是一个错误,现在已经编辑了。困扰我的问题是,是否在两个请求上使用相同的对象,如果是,如何对每个请求进行单独的验证?
  • 在我看来,您发现使用相同的表示是很自然的……我也会这样做。因为您似乎在方法运行之前进行了验证,所以它有点棘手(您可以在 PUT 验证之前在对象中设置一个 ID 字段,或者您可以在验证之前在对象中设置一个标志来调整验证逻辑)。在这种情况下,我要做的只是使字段 optional 然后在 updateEntity 方法中手动验证它(即,如果未设置该字段,则手动返回错误请求) - 你无论如何都必须检查 ID 是否指向现有实体。
  • 我也采用了类似的方法,一种称为个案的手动验证方法。但是使用@user3487063 发布的验证组的方法看起来很有希望。也会尝试的:)。

标签: java spring rest validation request


【解决方案1】:

您可以为此使用validation groups

你需要先有一个接口:

import javax.validation.groups.Default;

public interface ExchangeEntityPutValidation extends Default {}

您将在您的 DTO 类中使用它,如下所示:

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

public class EntityExchange {

  @NotBlank(message = "...", groups = ExchangeEntityPutValidation.class)
  private String id;

  @NotNull private String other;
}

接下来,您可以在控制器中使用它,如下所示:

import javax.validation.Valid;

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Validated
public class TestController {

  @PostMapping(value = "/")
  public ResponseEntity<CustomResponse<EntityExchange>> createEntity(
      @Valid @RequestBody EntityExchange entityExchange) {
    return null;
  }

  @PutMapping(value = "/{id}")
  public ResponseEntity<CustomResponse<EntityExchange>> updateEntity(
      @Validated({ExchangeEntityPutValidation.class}) @RequestBody EntityExchange entityExchange) {
    return null;
  }
}

基本上,通过这种方式,您要求 Spring 将 ExchangeEntityPutValidation 验证组应用于验证步骤。

【讨论】:

  • 酷,还没有听说过验证组。一定会试试这个。顺便说一句,是指“ExchangeEntityPutValidation”的示例中的“HttpPostValidation”
猜你喜欢
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多