SpringBoot 参数校验 --Validation

211 阅读2分钟

SpringBoot 参数校验 --Validation

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

参数添加校验规则注解、定义注解生效分组

@Data
public class SysUserParam extends BaseParam {

    /**
     * 主键
     */
    @NotNull(message = "id不能为空",
            groups = {edit.class, detail.class})
    private Long id;
    
    /**
     * 账号
     */
    @NotBlank(message = "账号不能为空", groups = {add.class, edit.class})
    private String account;

    /**
     * 姓名
     */
    @NotBlank(message = "姓名不能为空", groups = {add.class, edit.class})
    private String name;

    /**
     * 校验分组
     */
    public @interface add {}
    public @interface edit {}
    public @interface detail {}
    
}

接口添加校验启用注解和校验参数分组

@RestController
public class SysUserController {

    @Resource
    private SysUserService sysUserService;

    /**
     * 增加系统用户
     */
    @PostMapping("/sysUser/add")
    public ResponseData add(@RequestBody @Validated(SysUserParam.add.class) 
                            SysUserParam sysUserParam) {
        sysUserService.add(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 编辑系统用户
     */
    @PostMapping("/sysUser/edit")
    public ResponseData edit(@RequestBody @Validated(SysUserParam.edit.class) 
                             SysUserParam sysUserParam) {
        sysUserService.edit(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 查看系统用户
     */
    @GetMapping("/sysUser/detail")
    public ResponseData detail(@Validated(SysUserParam.detail.class) 
                               SysUserParam sysUserParam) {
        return new SuccessResponseData(sysUserService.detail(sysUserParam));
    }
 }

参数校验异常统一捕获处理

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ErrorResponseData methodArgumentNotValidException(MethodArgumentNotValidException e) {
    String argNotValidMessage = getArgNotValidMessage(e.getBindingResult());
    log.error(">>> 参数校验错误异常,具体信息为:{}", argNotValidMessage);
    return renderJson(ParamExceptionEnum.PARAM_ERROR.getCode(), argNotValidMessage);
}

自定义校验规则

eg:手机号校验

@Documented
@Constraint(validatedBy = MobileValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MobileValue {

    String message() default "手机号格式错误"
    Class[] groups() default {};
    Class<? extends Payload>[] payload() default {};

    @Target({ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RUNTIME)
    @Documented
    @interface List {
    	MobileValue[] value();
    }
}
public class MobileValidator implements ConstraintValidator<MobileValue, String> {
    @Override
    public boolean isValid(String mobileValue, ConstraintValidatorContext context) {
    	if(ObjectUtil.isNotEmpty(mobileValue)) {
      	  return PhoneUtil.isMobile(mobileValue); 	
    	}
    	return false;
    }
}
# 接口使用
@MobileValue
private String phone;

常用校验规则

  • @NotBlank

    用于判断字符串非空,不能为null,不能为空字符串

  • @NotNull

    用于判断基本类型不能为null

  • @NotEmpty

    用于判断集合类非空,不能为null,长度必须大于0

  • @Size(min = 2, max = 14)

    用于判断集合长度必须在最大值与最小值之间

  • @Range(min = 2,max = 4)

    用于校验数据值在一定的范围内

  • @Min(2)

    对象必须是数字,且值最小为设定值

  • @Max(12)

    对象必须是数字,且值最大为设定值

  • @Length(min = 2, max = 4)

    判断字符串长度

  • @Pattern

    值必须满足给定的正则表达式

  • @Email

    值必须为email格式

  • @AssertTrue

    对象值如果不为null则必须为true

  • @AssertFalse

    对象值如果不为null则必须为false

  • @Valid

    用于实体参数,表示改实体参数也需要进行校验