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