Validated校验
实例一:
使用Validated
1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、给对象添加校验注解
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.PastOrPresent;
import java.time.LocalDateTime;
/**
* @Author ylt
* @Date 2021/10/20 17:18
* @Description
*/
public class Department {
@Null(message = "只能为空")
private Integer id;
@NotNull //整数用NotNull
private Integer parent_id;
@NotBlank //字符串用NotBlank
private String name;
@NotNull
@PastOrPresent
private LocalDateTime createTime;}
还可以使用其他校验数据的要求,
3、操作controller
@RestController
@RequestMapping("department")
@Validated //使用校验必须在类上加@Validated注解
public class DepartmentController {
@PostMapping
public String add(@RequestBody @Valid/*对校验对象添加Valid*/ Department department){
return "ok";
}
}
4、启动项目查看效果
显示ok成功访问到后台
现在测试数据不正常效果
当id 不为空的时候,传递到控制器controller发现 id不为空就出现400,请求参数错误。
这种比较简单,导入依赖使用注解,然后去conroller 请求时候添加@Valid,在类上添加@Validated
注意:Controller 接口参数必须是@ResponseBody 注解 否则无效 或异常
创建一个全局异常处理类
@ControllerAdvice(basePackages = "com.example.validation.controller") //如果不指定扫描全部,影响性能
@ResponseBody //返回必须要ResponseBody
public class ctrlAdvice {
@ExceptionHandler //指定包下得Controller类中出现异常会进来,但是这里指定了MethodArgumentNotValidException异常,如果要作为处理全局异常自己定义一个异常类,在控制器中抛出该类即可
public ResultVo ExceptionHandler(MethodArgumentNotValidException e){
/**
* id -主键不能有值
* name - name不能为空
*/
//这个异常是 Valid的校验异常,通过该对象获取集合转换map对象
Map<String, String> collect = e.getBindingResult().getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
return ResultVo.fail(ErrorCode.PARAM_ERROR,collect);
}
}
二: 分组校验
public class Validatetion {
public interface addValida{}
public interface updateValida{}
}
创建一个分组类,里面是接口,作为区分多个分组
public class Department {
// @Null(message = "只能为空")
@NotNull(groups = {Validatetion.updateValida.class})
@Null(groups = {Validatetion.addValida.class})
private Integer id;
// @NotNull //整数用NotNull
// @NotNull(groups = {Validatetion.addValida.class,Validatetion.updateValida.class} )
private Integer parentId;// @NotBlank //字符串用NotBlank
@NotNull(groups = {Validatetion.addValida.class,Validatetion.updateValida.class})
private String name;
// @NotNull
@PastOrPresent
@NotNull(groups = {Validatetion.addValida.class,Validatetion.updateValida.class})
private LocalDateTime createTime;
}
实体类
一个字段上可以有多个校验字段,但是设置它属于那一个分组类
@RestController
@RequestMapping("department")
@Validated //使用校验必须在类上加@Validated注解
public class DepartmentController {
@PostMapping
public ResultVo add(@RequestBody @Valid/*对校验对象添加Valid*/ Department department){
return ResultVo.success();
}
@PostMapping("/group")
public ResultVo group(@RequestBody /*对校验对象添加Valid*/ @Validated( {Validatetion.addValida.class}) Department department){
return ResultVo.success();
}
}
这里使用@Validated ,不是@Valid注解。
这里字段上如果没加上分组,这里可以使用Default.class 默认分组, 一般不这样写,不然controller,会到处有这些默认分组,一般在实体类上写上所有 add和update
JavaScript