Spring 控制器中的 @Validated 和 @Valid 对于返回类型的工作方式不同

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

我有一个 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,并且行为不会改变。

java spring spring-boot validation spring-mvc
1个回答
0
投票

为什么 Spring 表现出如此令人困惑和不一致的行为?

其实这并不令人困惑。虽然响应验证很少见,但这种行为是相当合理的。

当您验证由client提供的请求时。 HTTP 400 BadRequest 最适合描述无效输入。这样客户端就可以修复请求并重新发送。

但是当您验证由服务器创建的响应时,返回 400 并没有真正意义,因为响应来自服务器。它实际上是一个服务器错误(这就是为什么它返回500内部服务器错误)。客户无法修复该错误。

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