Spring Validation 路径变量与请求参数校验

使用 Spring-Validation 进行参数校验 中,我对如何使用 Spring Validation 进行参数校验进行了介绍。但是其中只介绍了从请求体中获取的自定义参数如何进行校验, 并没有介绍对于一些基本类型的参数如何进行校验。这些基本类型参数往往通过 @PathVariable 从请求路径中 获取或者通过 @RequestParam 从请求参数中获取。本文将介绍如何使用 Spring Validation 对通过 @PathVariable@ReqeustParam 获取的基本类型参数进行校验。

@Validated

要对通过 @PathVariable@RequestParam 获取的参数进行校验,我们必须要在控制器类上添加 @Validated 注解。该注解由 Spring 提供以实现比 JSR-303 更加灵活的功能。

@Validated 官方的文档中,有这样一句话:

Applying this annotation at the method level allows for overriding the validation groups for a specific method but does not serve as a pointcut; a class-level annotation is nevertheless necessary to trigger method validation for a specific bean to begin with.

简单来说就是当 @Validated 在方法上的参数使用时,可以实现组校验,而如果要启用方法级别的校验,则必须 在类上添加 @Validated 注解。

完成了上面的准备工作后,我们就可以在控制器类中的方法参数上添加校验注解了。例如:

@Validated
@RestController
public class UserController {
    @Autowired private UserService userService;

    @GetMapping(ApiPathConstant.USER_CHECK_EMAIL_VALIDITY_API_PATH)
    public void checkEmailValidity(
            @Email(message = "USERDTO_EMAIL_EMAIL {UserDTO.email.Email}")
            @NotBlank(message = "USERDTO_EMAIL_NOTBLANK {UserDTO.email.NotBlank}")
            @RequestParam("email")
            String email) {
        QueryWrapper<UserPO> wrapper = new QueryWrapper<UserPO>();
        wrapper.eq("email", email);
        if (userService.exists(wrapper)) {
            throw new GenericException(ErrorCodeEnum.EMAIL_ALREADY_EXISTS, email);
        }
    }
}

这样操作后,当请求到达 checkEmailValidity 方法时,Spring 会自动对 email 参数进行校验。需要注意 的是:此时如果检验没有通过会抛出 ConstraintViolationException 而不是 MethodArgumentNotValidException。我们可以通过以下的方式进行全局异常处理:

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<ErrorVO> handleConstraintViolationException(
            ConstraintViolationException e, HttpServletRequest request) {
        // do something
    }
}

巨人的肩膀




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • IEEE Xtreme 18.0 题解
  • 马拉松 4 小时挑战记录
  • ssh 端口转发简介
  • 服务器上创建 git 远程仓库
  • Spring Boot Test 自定义测试类顺序