Java JSR-303 1数据校验
一、依赖引入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
二、在Controller中用@Valid做校验
@Validated:提供了一个分组功能
@Valid:不支持分组的功能
@RestController public class TestController { @RequestMapping("/yyy") public void test(@Valid Test test ,BindingResult bindingResult) { doSomething(); } }
给校验的bean后紧跟一个 BindingResult ,就可以获取到校验的结果
简单的异常处理
@RequestMapping("/xxx")
public R save(@RequestBody @Valid BrandEntity brand, BindingResult result) {
if (result.hasErrors()) {
Map<String,String> map = new HashMap<>();
//1、获取校验的错误结果
result.getFieldErrors().forEach((item) -> {
// 获取到错误提示
String message = item.getDefaultMessage();
// 获取错误的属性的名字
String field = item.getField();
map.put(field,message);
});
// R为异常处理实体
return R.error(400, "提交的数据不合法").put("data",map);
} else {
doSomething();
}
return R.ok();
}
统一的异常处理
1、抽取一个异常处理类,使用@ControllerAdvice
2、使用@ExceptionHandler标注方法可以处理的异常
/** * 集中处理所有异常 */ @Slf4j //@ResponseBody //@ControllerAdvice(basePackages = "com.syf.gulimall.product.controller") @RestControllerAdvice(basePackages = "com.syf.gulimall.product.controller") public class ExceptionControllerAdvice { //指定处理 @ExceptionHandler(value = MethodArgumentNotValidException.class) public R handleVaildException(MethodArgumentNotValidException e){ log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass()); // 拿到数据校验的错误结果 BindingResult bindingResult = e.getBindingResult(); Map<String,String> errorMap = new HashMap<>(); bindingResult.getFieldErrors().forEach((fieldError)->{ // fieldError.getField(): 校验错误的字段 // fieldError.getDefaultMessage(): 校验错误字段的提示 errorMap.put(fieldError.getField(),fieldError.getDefaultMessage()); }); return R.error(500,"message").put("data",errorMap); } @ExceptionHandler(value = Throwable.class) public R handleException(Throwable throwable) { log.error("错误",throwable); // 未知异常 return R.error(400, "未知异常"); } }
三、分组校验
1、创建分组,分组是一个接口(接口中无方法),同时可以继承其他的组,这里创建两个分组。
public interface UpadteStatusGroup { } public interface UpdateGroup { }
2、校验注解上有一个属性,groups,为其指定分组
public class BrandEntity implements Serializable { private static final long serialVersionUID = 1L; @NotNull(message = "修改必须指定品牌id",groups = {UpdateGroup.class}) @Null(message = "新增不能指定id",groups = {AddGrouop.class}) @TableId private Long brandId; @NotBlank(message = "品牌名必须提交",groups = {AddGrouop.class,UpdateGroup.class}) private String name; @URL(message = "logo必须是一个合法的url地址") private String logo;
}
3、在controller层,添加@Validated注解,指定分组,可多个。
@RequestMapping("/update") public R update(@RequestBody @Validated({UpdateGroup.class}) BrandEntity brand) { dosomething(); return R.ok(); }
没有指定分组的注解@URL(message = "logo必须是一个合法的url地址"),在该分组校验情况下@Validated({UpdateGroup.class})不生效