gpt4 book ai didi

spring-boot - 为什么 Spring Boot 会为 Controller 方法参数验证抛出不同的异常?

转载 作者:行者123 更新时间:2023-12-03 18:31:39 25 4
gpt4 key购买 nike

在使用约束验证注解(@Min、@NotNull、...)验证原始类型或其等价物(Integer、Boolean)时,Spring Boot 抛出 ConstraintViolationException .但是当使用 @Valid 验证参数时注释然后 MethodArgumentNotValidException被抛出。

我有一个用 @ControllerAdvice 注释的类处理来自 Controller 的异常。
问题在于,取决于 spring-boot-starter-parent版本,结果大不相同。
使用版本 2.0.5.RELEASE 时我只需要包含 ConstraintViolationException 的处理程序类(class)。
但是还有一些其他版本 MethodArgumentNotValidException也被抛出。

它已经在 GitHub issue 中提到过。 ,但没有有用的答案...

我将在这里使用 lukasniemeier-zalando 的示例。更多详情请点击上面的链接。

 @Validated  // needed to actually trigger validation
@RestController
class MyController {

@RequestMapping
Response serve(
@RequestParam @Min(2) Integer parameter, // throws ConstraintViolationException
@RequestBody @Valid BodyModel body // throws MethodArgumentNotValidException
) {
return new Response();
}

}

我希望两个验证都抛出相同的异常,无论它们中的哪一个,只是为了保持一致。

显然没有理由像现在这样,至少这是我从另一个 GitHub issue 中理解的。 .

然后我只想回答为什么 Spring Boot 会抛出 2 种类型的异常来表示相同的问题(参数验证)。

备注 : 如前所述,使用版本 2.0.5.RELEASEspring-boot-starter-parent它不会发生。

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>

但正如我链接的最后一个 GitHub 问题所报告的,版本 2.0.0.M4有这种行为,我也经历过 2.2.0.M3版本。

最佳答案

它们由不同的验证机制处理。 @Validated类上由 MethodValidationInterceptor 处理这是一个 通用验证机制上课。因此,它会抛出 ConstraintViolationException . @Validated在这里使用只是因为 @Valid 类型上不允许注释。因此,启用/触发 MethodValidationInterceptor 的唯一方法是是通过使用 @Validation注解。
@Valid Controller 中的方法参数由 ModelAttributeMethodProcessor 处理。在内部并导致 Web 特定绑定(bind)异常 , MethodArgumentNotValidException . ModelAttributeMethodProcessor RequestMappingHandlerAdapter 调用(间接)在准备方法调用时。而不是 @Valid您也可以使用 @Validated方法参数上的注释。 Spring MVC 支持两者(它实际上支持 @Validated@Valid 甚至存在之前!)。

解决方案/解决方法是创建自己的异常处理程序来处理 ConstraintViolationExceptionMethodArgumentNotValidException 相同.您链接到的 GitHub 问题中也建议了这一点。

关于spring-boot - 为什么 Spring Boot 会为 Controller 方法参数验证抛出不同的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56467965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com