导入需要的依赖
<!-- jsr303校验规范-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
在需要使用的javabean中使用注解(需要自定义的错误信息可以使用message属性指定信息),使用pattern注解自定义规则
//这是说明name属性不能为空的校检
@NotBlank(message="名称不能为空")
private String name;
在springMVC中使用注解@Vaild告知接受的Javabean需要进行校检
@RequestMapping("/save")
//@RequiresPermissions("productService:brand:save")
public R save(@Valid @RequestBody BrandEntity brand){
brandService.save(brand);
return R.ok();
}
简单的校验到此结束,当前端传来的数据中name属性为空的时候,触发了检验(不符合业务逻辑)
可以在校验的数据后面,加上一个BindingResult result 可以获取到错误的信息
@RequestMapping("/save")
//@RequiresPermissions("productService:brand:save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
// brandService.save(brand);
if (result.hasErrors()){
Map<String,String> map=new HashMap<>();
//获取检验的错误结果
result.getFieldErrors().forEach((item)->{
//获取到了错误的信息
String defaultMessage = item.getDefaultMessage();
String field = item.getField();
map.put(field,defaultMessage);
});
return R.error(400,"数据检验错误").put("data",map);
}else {
brandService.save(brand);
}
return R.ok();
}
升级版,全局处理检验错误,借助springMVC中的RestControllerAdvice进行全局异常处理
@RestControllerAdvice
public class exceptionControllerAdvice {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleVaildException(MethodArgumentNotValidException e){
BindingResult result = e.getBindingResult();
Map<String,String> map=new HashMap<>();
//获取检验的错误结果
result.getFieldErrors().forEach((item)-> {
//获取到了错误的信息
String defaultMessage = item.getDefaultMessage();
String field = item.getField();
map.put(field, defaultMessage);
});
return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",map);
}
//处理更多的异常
@ExceptionHandler(value = Exception.class)
public R handleException(Exception e){
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
分组进行检验
第一步先定义分组的接口
public interface AddGroup {
}
public interface AddGroup {
}
第二步在需要的分组字段使用标志
@NotNull(message = "修改必须指定id",groups = {UpdateGroup.class})
@Null(message = "新增不用指定id",groups = {AddGroup.class})
@TableId
private Long brandId;
第三步开启分组检验的模式
public R save(@Validated(value = {AddGroup.class}) @RequestBody BrandEntity brand, BindingResult result){
brandService.save(brand);
}
自定义检验规则
@Documented
//ListValueConstraintValidator检验规则,可以拥有多个
@Constraint(validatedBy = { ListValueConstraintValidator.class })
//可以在哪种方式检验,方法上,字段属性
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
//运行时候进行检验
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{com.atguigu.common.valid.ListValue.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
int[] vals() default { };
}
ListValueConstraintValidator类
package com.chh.common.valid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set = new HashSet<>();
//初始化方法
@Override
public void initialize(ListValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
set.add(val);
}
}
//判断是否校验成功
/**
*
* @param value 需要校验的值
* @param context
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
使用自定义检验
@ListValue(vals = {0,1},groups = {AddGroup.class,UpdateGroup.class})
private Integer showStatus;