目录
前端elment-ui 校验器
正则表达式校验
JSR303数据校验
统一异常处理
JSR303分组校验
自定义校验
编写自定义注解
定义校验器类
自定义messasge
应用
form表单加上 :rules="**"
字段加上 prop="*"
firstLetter: [
{
validator: (rule, value, callback) => {
if (value === "") {
callback(new Error("首字母必须填写"));
} else if (!/^[a-zA-Z]$/.test(value)) {
callback(new Error("首字母必须返回A-Z之间"));
}
},
trigger: "blur",
},
],
sort: [
{
validator: (rule, value, callback) => {
if (value == "") {
callback(new Error("排序必须填写"));
} else if (!/^[0-9]*$/.test(value)) {
callback(new Error("排序必须是一个大于0的整数"));
}
},
trigger: "blur",
},
]
导入依赖springboot2.2.3版本不在集成validate需要自己导入依赖
org.springframework.boot
spring-boot-starter-validation
2.2.1.RELEASE
试题中添加@NotEmpty
请求参数前加上@Valid
测试
正则表达式:/^[a-zA-Z]$/
以^a开始到Z$结束
实体类
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 品牌id
*/
@TableId
private Long brandId;
/**
* 品牌名
*/
@NotEmpty(message = "name字段不可为空")
private String name;
/**
* 品牌logo地址
*/
@NotEmpty
@URL(message = "logo必须是一个合法的url地址")
private String logo;
/**
* 介绍
*/
private String descript;
/**
* 显示状态[0-不显示;1-显示]
*/
private Integer showStatus;
/**
* 检索首字母
*/
@NotEmpty
@Pattern(regexp = "/^[a-zA-Z]$/",message = "检索首字母必须是一个字母")
private String firstLetter;
/**
* 排序
*/
@NotNull
@Min(value = 0,message = "排序必须大于等于0")
private Integer sort;
}
@RequestMapping("/save")
// @RequiresPermissions("product:brand:save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
if(result.hasErrors()){
Map map = new HashMap<>();
//获取校验的错误信息
result.getFieldErrors().forEach((item)->{
String defaultMessage = item.getDefaultMessage();
String filed = item.getField();
map.put(filed,defaultMessage);
});
return R.error(400,"连接数据不合法").put("data",map);
}else{
brandService.save(brand);
}
return R.ok();
}
使用SpringMVC的@controllerAdvce
定义一个异常类
/**
package com.atguigu.gulimall.product.exception;
import com.atguigu.common.exception.BizCodeEnume;
import com.atguigu.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
/**
* 集中所有异常
*/
@Slf4j
//@ResponseBody
//@ControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
public class ExceptionControllerAdvice {
/**
* 告诉spring处理什么异常
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleVaildException(MethodArgumentNotValidException e){
log.error("数据校验出现问题{},异常类型{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
Map errorMap = new HashMap<>();
//遍历异常数据
bindingResult.getFieldErrors().forEach((item)->{
String field = item.getField();
String message = item.getDefaultMessage();
errorMap.put(field,message);
});
//返回异常结果集
return R.error(BizCodeEnume.INVAILD_EXCEPTION.getCode(),BizCodeEnume.INVAILD_EXCEPTION.getMsg()).put("data",errorMap);
}
/**
* 如果有异常精确匹配到handleVaildException方法异常,启动handleVaildException方法异常
* 不可以匹配到,则走handleException方法异常
* 全局匹配异常
*/
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable){
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
}
/**
* 品牌id
*/
@NotNull(message = "修改必须制定品牌id",groups = {UpdateGroup.class})
@Null(message = "新增不能指定id",groups = {AddGroup.class})
@TableId
private Long brandId;
/**
* 品牌名
*/
@NotEmpty(message = "name字段不可为空",groups = {UpdateGroup.class,AddGroup.class})
private String name;
/**
* 品牌logo地址
指定分组,进行校验,没有指定分组的字段不走校验
@Documented
//使用那个校验器获取到的
@Constraint( validatedBy = {ListValueConstraintValidator.class})
//注解可以标注在哪些位置
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
//可以在运行时获取到
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
//com.atguigu.common.valid.ListValue.mes
String message() default "{com.atguigu.common.valid.ListValue.mes}";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
int[] vals() default {};
}
@Constraint( validatedBy = {ListValueConstraintValidator.class})
public class ListValueConstraintValidator implements ConstraintValidator {
private Set set = new HashSet<>();
//初始化方法
@Override
public void initialize(ListValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();
for (int val:vals ) {
set.add(val);
}
}
//判断是否校验成功
/**
*
* @param value 需要校验的值
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
//判断是否包含值
return set.contains(value);
}
}
必须包含1或2否则错误
@ListValue(vals = {0,1},groups = {UpdateGroup.class,AddGroup.class})
private Integer showStatus;