我有一个 Spring Boot 3 项目,添加了验证依赖项。
有 POJO - 人类:
@Data
public class Human {
@NotBlank
private String name;
@NotBlank
private String email;
}
并且有一个经过验证的控制器可以按预期工作:
它正在验证收到的 Human 对象。
@RestController
@RequestMapping("/stub")
public class ExampleController {
@GetMapping("/exampleUpdate")
public Human getExampleUpdate(@Valid @RequestBody Human human) {
System.out.println("Updat Validated Successfully");
return human;
}
}
我正在向此控制器传递来自邮递员的请求: 邮递员请求
如果我在 @Validated 上更改 @Valid 并返回方法参数,我总是得到与响应相同的结果: 邮递员回复
但是这个控制器出现了我的问题:
我已将请求验证更改为响应验证,但结果令人困惑。
@RestController
@RequestMapping("/stub")
public class ExampleController {
@GetMapping("/exampleUpdate")
@Valid
public Human getExampleUpdate(@RequestBody Human human) {
System.out.println("Update Validated Successfully");
return human;
}
}
邮递员中的请求是相同的。 但这次我在@Valid上收到了不同的回复: 邮递员回复
如果我在 @Validated 上更改 @Valid - 验证就会消失。它只是返回带有空白字段的对象,就像这样很好: 邮递员回复
为什么 Spring 表现出如此令人困惑和不一致的行为?
我期望在验证返回的对象时,验证行为将与接收对象时的行为类似。也就是说,您可以将@Valid替换为@Validated,并且行为不会改变。
其实这并不令人困惑。虽然响应验证很少见,但这种行为是相当合理的。
当您验证由client提供的请求时。 HTTP 400 BadRequest 最适合描述无效输入。这样客户端就可以修复请求并重新发送。
但是当您验证由服务器创建的响应时,返回 400 并没有真正意义,因为响应来自服务器。它实际上是一个服务器错误(这就是为什么它返回500内部服务器错误)。客户无法修复该错误。