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})不生效

 

posted @ 2022-06-28 21:45  非帆丶  阅读(68)  评论(0编辑  收藏  举报