springboot参数校验

编程

SpringBoot内置了Hibernate Validator作为校验框架,只要我们集成了SpringBoot,就可以使用Hibernate Validator来完成参数校验。

常用注解

  • @Null:被注释的属性必须为null;
  • @NotNull:被注释的属性不能为null;
  • @AssertTrue:被注释的属性必须为true;
  • @AssertFalse:被注释的属性必须为false;
  • @Min:被注释的属性必须大于等于其value值;
  • @Max:被注释的属性必须小于等于其value值;
  • @Size:被注释的属性必须在其min和max值之间;
  • @Pattern:被注释的属性必须符合其regexp所定义的正则表达式;
  • @NotBlank:被注释的字符串不能为空字符串;
  • @NotEmpty:被注释的属性不能为空;
  • @Email:被注释的属性必须符合邮箱格式。

其中 @NotNull,@NotEmpty,@NotBlank区别

  • @NotNull是基础类型上的
  • @NotEmpty是在集合上的
  • @NotBlank是在String类型上的

实现参数校验

在vo对象的字段上添加注解

import com.seckillproject.common.GenderValid;

import javax.validation.constraints.Min;

import javax.validation.constraints.NotBlank;

/**

* @Auther cj-ervin

* @Date 2020/4/18

*/

public class UserVo {

private Integer id;

@NotBlank(message = "姓名不能为空")

private String name;

@Min(value = 0,message = "年龄不能小于0岁")

private Integer age;

@NotBlank(message = "手机不能为空")

private String telphone;

@NotBlank(message = "密码不能为空")

private String password;

@NotBlank(message = "验证码不能为空")

private String checkCode;

}

在controller方法入参添加 @Validated 和 BindingResult

    @ResponseBody

@RequestMapping(value = "/register",method = RequestMethod.POST)

public CommonReturn register(@Validated @RequestBody UserVo userVo , BindingResult bindingResult) throws BusinessException {

//校验验证码

if (!userVo.getCheckCode().equals(this.request.getSession().getAttribute(userVo.getTelphone()))){

throw new BusinessException(EnumBusinessError.PARAMETER_VALIDATION_ERROR.setErrorMsg("验证码校验错误"));

}

UserDto userDto = convertToUserDto(userVo);

userService.register(userDto);

return CommonReturn.success(null);

}

配合aop实现参数校验

/**

* @Auther cj-ervin

* @Date 2020/4/19

*/

@Aspect

@Component

public class ParamValidator {

@Pointcut("execution(public * com.seckillproject.controller.*.*(..))")

public void paramValid(){

}

@Around("paramValid()")

public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {

Object[] args = joinPoint.getArgs();

for (Object obj:args) {

if (obj instanceof BindingResult){

BindingResult bindingResult = (BindingResult) obj;

if (bindingResult.hasErrors()){

FieldError fieldError = bindingResult.getFieldError();

if (fieldError != null){

return CommonReturn.fail(fieldError.getDefaultMessage());

}else{

return CommonReturn.fail();

}

}

}

}

return joinPoint.proceed();

}

}

现在来验证一下:

当年龄输入小于0时,就会有提示信息。

自定义注解

有时候业务需求,框架提供的注解无法满足我们的需求,这是我们就需要自定义注解来实现。

比如我们想要 gender 性别字段实现校验,只能传入1或2,传入其他的值会提示非法参数。

定义注解

@Target({ElementType.PARAMETER,ElementType.FIELD})

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = GenderValidator.class)

public @interface GenderValid {

String[] value() default {};

String message() default "";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

}

校验规则

/**

* @Auther cj-ervin

* @Date 2020/4/19

*/

public class GenderValidator implements ConstraintValidator<GenderValid,Byte> {

private String[] values;

@Override

public void initialize(GenderValid constraintAnnotation) {

this.values = constraintAnnotation.value();

}

@Override

public boolean isValid(Byte aByte, ConstraintValidatorContext constraintValidatorContext) {

boolean isValid = false;

if(aByte==null){

//当状态为空时使用默认值

return true;

}

for(int i=0;i<values.length;i++){

if(values[i].equals(String.valueOf(aByte))){

isValid = true;

break;

}

}

return isValid;

}

}

vo 对象里面使用注解

/**

* @Auther cj-ervin

* @Date 2020/4/18

*/

public class UserVo {

private Integer id;

@NotBlank(message = "姓名不能为空")

private String name;

@GenderValid(value = {"1","2"},message = "性别请输入1或2")

private Byte gender;

@Min(value = 0,message = "年龄不能小于0岁")

private Integer age;

@NotBlank(message = "手机不能为空")

private String telphone;

@NotBlank(message = "密码不能为空")

private String password;

@NotBlank(message = "验证码不能为空")

private String checkCode;

}

验证,

至此,controller 层面的参数校验已经完成了。service 或者 dao 层面的数据校验,可以配合异常处理来实现,这个后面写篇博客来说一下。

以上是 springboot参数校验 的全部内容, 来源链接: utcz.com/z/515632.html

回到顶部