当除了路径变量之外还传递请求正文时,Spring Rest 控制器无法验证路径变量

问题描述 投票:0回答:4

我有一个休息控制器,其中一个端点如下所示:

@PostMapping(value = "/myapi/{id}", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
public ResponseEntity<MyEntity> myApi(
          @Valid @PathVariable("id") @NotBlank String id,
          @Valid @RequestBody MyRequestPayload myRequestPayload) throws Exception)
{
  LOGGER.info("Id is {}",id);
  ...............
  .........................
  .............................
}

由于某种原因,当我使用空或 null 路径变量和请求负载调用 API 时,路径变量不会导致验证失败,并且控件位于方法块内。 我究竟做错了什么?请指教。

spring spring-boot spring-restcontroller
4个回答
1
投票

@Valid
验证复杂对象,包含使用约束注释进行注释的字段。

对于这种情况,您需要使用

@Validated

@Validated
注解是一个类级注解,我们可以用它来告诉 Spring 验证传递到被注解类的方法中的参数。

因此将您的控制器类标记为

@Validated
,这将触发
id
路径变量的验证。

@RestController
@RequestMapping("/my")
@Validated
public class MyController {

  @PostMapping(value = "/myapi/{id}", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
  public ResponseEntity<MyEntity> myApi(
      @PathVariable("id") @NotBlank String id,
      @Valid @RequestBody MyRequestPayload myRequestPayload) throws
      Exception {
    LOGGER.info("Id is {}", id);
  }
}

参考:使用 Spring Boot 进行验证


1
投票

您正在将

@Valid
注释与 String 对象一起使用。

字符串没有“有效”状态。

如果您不希望它为空或空白,您可以使用

@NotBlank
代替。


0
投票

删除@Valid并尝试使用@PathVariable(value = "id",required = true)和@RequestBody(required=true)


0
投票

@Toni,你提出的解决方案没有导致@Valid注解的对象被验证两次吗?我在我的项目中看到过这种行为

© www.soinside.com 2019 - 2024. All rights reserved.