Spring @Validated注解进阶使用(条件执行)

    POST请求 Spring @Validated注解是@Valid注解的变体,增加groups属性进行分组验证。
  1. 首先定义一个分组
public interface ModifyRequest {
          
   
}
  1. 在@Validated注解中指定分组
@PostMapping("/modifyResource")
public void modifyResource(@RequestBody @Validated(ModifyRequest.class) AdminResourceReqVo req) {
          
   
        
}
  1. 在请求实体中的校验注解中指定分组
@Data
public class AdminResourceReqVo {
          
   
    @NotBlank(message = "资源ID不能为空", groups = ModifyRequest.class)
    private Integer resourceId;
}

通过上面3步则可实现条件执行请求对象中的验证。

    GET请求 GET请求如果需要用校验注解,需要在Controller类上面添加@Validated注解,否则不生效
@RestController
@RequestMapping("/api/admin/role")
@Validated
public class AdminRoleController {
          
   
    @GetMapping("/getRoleById")
    public void getRoleById(@RequestParam @NotNull(message = "角色ID不能为空") Integer roleId) {
          
   

    }
}

其实也不是完全是GET和POST这样区别,也可以说是URL变量和JSON变量的区别。他们抛出的异常也不一样,对应从异常中获取注解中message的方式:

  1. JSON传参方式抛出异常为MethodArgumentNotValidException,通过ex.getBindingResult().getFieldError().getDefaultMessage()获取message信息。
  2. URL变量方式抛出异常为ConstraintViolationException,通过ex.getConstraintViolations().stream().findFirst().get().getMessage()获取。
经验分享 程序员 微信小程序 职场和发展