JSR303是什么
JSR303是一套JavaBean参数校验的标准,定义了很多常用的校验注解
可以直接将这些注解加在我们JavaBean的属性上面就可以在需要校验的时候进行校验了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
简单的数据效验
我们可以使用javax.validation.constraints包中提供的注解,给实体类字段添加规则。
1、给实体类添加验证规则
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId
private Long brandId;
//约束name不能为null,且至少有一个非空字符
@NotBlank(message = "品牌名必须提交")
private String name;
@NotBlank(message = "logo不能为空")
//URL是hibernate提供的注解,实现了JSR303规范。约束如果logo不为null的话,必须符合url格式
@URL(message = "logo格式不符")
private String logo;
private String descript;
// @Pattern(regexp = "[0-1]") //pattern不支持Integer
private Integer showStatus;
//使用正则表达式约束字段
@Pattern(regexp = "^[a-zA-Z]$" , message = "首字母必须是一个字母")
private String firstLetter;
@Min(value = 0 , message = "排序字段必须大于等于0")
private Integer sort;
}
2、controller层使用@Valid开启验证功能
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand){
brandService.save(brand);
return R.ok();
}
使用BindingResult处理异常
在上例中,虽然我们完成了数据验证,但是返回给前端的数据并不友好。在项目中应该返回一个统一的结果。
使用BindingResult得到接受参数效验的结果
@RequestMapping("/save")
//@RequiresPermissions("product:brand:save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
//1.出现参数非法情况
Map<String, String> map = new HashMap<>();
bindingResult.getFieldErrors().forEach(fieldError -> {
map.put(fieldError.getField(), fieldError.getDefaultMessage());
});
return R.error(400, "提交的数据不合法").put("data", map);
} else {
//2.参数验证通过, 执行正常逻辑
brandService.save(brand);
return R.ok();
}
}
使用全局异常
@Slf4j
@RestControllerAdvice(basePackages = "com.p.gulimall.pms.controller")
public class ExceptionController {
//使用全局异常处理,jsr303校验不符合报错异常
@ExceptionHandler(Exception.class)
public R exception(/*通过Exception e得到MethodArgumentNotValidException*/MethodArgumentNotValidException e){
log.error("数据异常类型:"+e.getClass());//数据异常类型:class org.springframework.web.bind.MethodArgumentNotValidException
System.out.println(e.getMessage());
Map<String,String> map=new HashMap<>();
BindingResult bindingResult = e.getBindingResult();//获取BindingResult效验的结果
bindingResult.getFieldErrors().forEach(itme->{
String defaultMessage = itme.getDefaultMessage();
String field = itme.getField();
map.put(field,defaultMessage);
});
return R.error(400,"数据不合法");
}