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

 

posted @ 2021-10-22 16:41  幻樱落日剑  阅读(100)  评论(0)    收藏  举报