我有一个休息控制器,其中一个端点如下所示:
@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 时,路径变量不会导致验证失败,并且控件位于方法块内。 我究竟做错了什么?请指教。
@Valid
验证复杂对象,包含使用约束注释进行注释的字段。
对于这种情况,您需要使用
@Validated
:
注解是一个类级注解,我们可以用它来告诉 Spring 验证传递到被注解类的方法中的参数。@Validated
因此将您的控制器类标记为
@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);
}
}
您正在将
@Valid
注释与 String 对象一起使用。
字符串没有“有效”状态。
如果您不希望它为空或空白,您可以使用
@NotBlank
代替。
删除@Valid并尝试使用@PathVariable(value = "id",required = true)和@RequestBody(required=true)
@Toni,你提出的解决方案没有导致@Valid注解的对象被验证两次吗?我在我的项目中看到过这种行为