springboot后端数据校验以及异常处理

常用校验工具包

1、package javax.validation.constraints 包

@null           验证对象是否为空
@notnull     验证对象是否为非空
@asserttrue       验证 boolean 对象是否为 true
@assertfalse      验证 boolean 对象是否为 false
@min           验证 number 和 string 对象是否大等于指定的值
@max           验证 number 和 string 对象是否小等于指定的值
@decimalmin    验证 number 和 string 对象是否大等于指定的值,小数存在精度
@decimalmax    验证 number 和 string 对象是否小等于指定的值,小数存在精度
@size           验证对象(array,collection,map,string)长度是否在给定的范围之内
@digits       验证 number 和 string 的构成是否合法
@past           验证 date 和 calendar 对象是否在当前时间之前
@future       验证 date 和 calendar 对象是否在当前时间之后
@pattern     验证 string 对象是否符合正则表达式的规则
@Email     验证邮箱

示例:

//    @size (min=3, max=20, message="用户名长度只能在3-20之间")
//    @size (min=6, max=20, message="密码长度只能在6-20之间")
//    @pattern (regexp="[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\\.[a-za-z]{2,4}", message="邮件格式错误")
//    @Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")
//    @Email(message = "比如输入正确的邮箱")
//    @NotNull(message = "用户名称不能为空")
//    @Max(value = 100, message = "年龄不能大于100岁")
//    @Min(value= 18 ,message= "必须年满18岁!" )
//    @AssertTrue(message = "bln4 must is true")
//    @AssertFalse(message = "blnf must is falase")
//    @DecimalMax(value="100",message="decim最大值是100")
//    DecimalMin(value="100",message="decim最小值是100")
//    @NotNull(message = "身份证不能为空")
//    @Pattern(regexp="^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message="身份证格式错误")

2、package org.hibernate.validator.constraints;包

在这里插入图片描述

校验注解的使用步骤

1、Bean添加校验注解、自定义message提示

@NotEmopty(message = "名称不能为空")
private String name;

2、controller使用@valid开启校验

 @PostMapping("/save")
 public R save(@valid @RequestBody BrandEntity brandEntity){
 }

直接开启校验 数据格式错误返回信息如下
在这里插入图片描述

2.1 使用BindingResult 获取校验信息 手动封装校验返回数据

紧跟校验对象后面添加 BindingResult 对象,获取校验结果
在这里插入图片描述

3、抽取校验异常 统一处理

需要校验的每一个controller都写上述处理,很麻烦,使用springMVC 提供的 @controllerAdvice 统一处理异常

1、controller抛出异常

校验对象后不需要追加 BindingResult 对象

2、编写统一异常处理类

可以指定异常处理的controller包路径
可以根据不同的异常,编写不同的异常处理方法

@RestControllerAdvice(basePackages = "com.quella.gulimall.product.controller")
public class ExceptionController{
	
	// 数据校验异常
	@ExceptionHandler(value = {MethodArgumentNotValidException.class} )
	public R handlevalidException(MethodArgumentNotValidException e){
		BindingResult bindingResult = e.getBindingResult();
		Map<String,String> errorMap = new HashMap<>();
		bindingResult.getFieldErrors().forEach( item -> {
			errorMap.put(item.getField(),item.getDefaultMessage());
		} );
		return R.error(400,"数据校验异常").put("data",errorMap);
	}
	
}

4、分组异常校验(新增、修改等多场景复杂校验)

4.1、定义不同分组

创建分组接口 , 在字段使用分组校验
在这里插入图片描述

groups 接受一个数组 : 数组里面的对象必须是接口 我们可以定义一个空接口

public interface addGroup{ }
public interface updateGroup{ }
4.2 controller注解 @valid 换为 @validated 指定需要校验的分组
 @PostMapping("/save")
 public R save(@validated({addGroup.class}) @RequestBody BrandEntity brandEntity){
 }

5、自定义校验注解

1 编写自定义校验注解

@Documented // 表明这个注解被javadoc管理
@Constraint(validatedBy = ListValueConstraintValidator.class) //指定注解校验器
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) // 指定注解使用的地方
@Retention(RUNTIME) // 指定注解的运行环境
public @interface ListValue{
	String message() default "数据不合法";
	Class<?>[] groups() default { };  //支持分组
	Class<? extends Payload>[] payload() default { }; 
	int[] values() default {};
}

2 编写自定义的校验器

/**
 * 自定义注解校验器
 * @author admin
 * @date 2020/7/8  1:02
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer>{
	
	private List<Integer> list = new ArrayList<>();
	
	/**
	 * 初始化方法  可以获取需要校验的注解的定义信息
	 * @param constraintAnnotation
	 */
	@Override
	public void initialize (ListValue constraintAnnotation){
		int[] values = constraintAnnotation.values();
		list = Arrays.stream(values).boxed().collect(Collectors.toList());
	}
	/**
	 * 校验
	 * @param value 本次校验的值  注解标注的属性对应的值
	 * @param context 上下文环境
	 * @return
	 */
	@Override
	public boolean isValid (Integer value,ConstraintValidatorContext context){
		return (list.contains(value)) ? true : false;
	}
}

3 两者建立关联
@Constraint(validatedBy = ListValueConstraintValidator.class)
如果自定义的注解的值种类很多 有Integer Double等 可以定义多个校验器针对不同的类型进行校验
@Constraint(validatedBy ={ ListValueConstraintValidatorForInteger.class, ListValueConstraintValidatorForDouble.class})

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值