同一实体多字段的不同校验--validate

109 阅读2分钟

validate的使用,同一实体分组校验 ValidatorFactory

文章目录


前言

实际开发中遇到这样一个问题,一个接收参数的实体类,作为修改和新增的接口的入参,但是主键在新增中不是必传的,在修改中是必传的,那么如何用validation 校验呢?


一、举个例子

我有实体类如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasicArea {

    private String id;

    /**
    * 区域名称
    */
    private String name;


    /**
    * 区域备注
    */
    private String remark;

    /**
    * 父级区域id
    */

    @NotNull(message = "不能为null")
    private String parentId;

    /**
    * 所有父级区域id
    */
    @Min(value=3,message = "长度最小值为3")
    @Max(value=30,message = "长度最大值为30")
    private String path;

    /**
    * 区域层级
    */
    private Integer depth;

    /**
    * 扩展属性
    */
    private String extend;

    /**
    * 排序号
    */
    private Integer sort;
    
}

即是修改入参,也是新增入参;现在要分别校验,我们采用分组校验的方式

二、使用步骤

1.引入依赖

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>2.4.3</version>
   </dependency>

2. 加入分组标识

增加后的实体

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasicArea {

    @NotBlank(groups={update.class})
    private String id;

    /**
    * 区域名称
    */
    private String name;


    /**
    * 区域备注
    */
    private String remark;

    /**
    * 父级区域id
    */

    @NotNull(message = "不能为null")
    private String parentId;

    /**
    * 所有父级区域id
    */
    @Min(value=3,message = "长度最小值为3",groups = {add.class})
    @Max(value=30,message = "长度最大值为30")
    private String path;

    /**
    * 区域层级
    */
    private Integer depth;

    /**
    * 扩展属性
    */
    private String extend;

    /**
    * 排序号
    */
    private Integer sort;

    public interface add{

    }

    public interface update{

    }
    
}

3. 分组校验应用

1.

明确知道当前接口方法(新增/修改)

改造controller即可,例如我知道当前为修改接口

    @RequestMapping("/validate")
    public Object validate(@RequestBody @Validated(BasicArea.update.class)BasicArea basicArea){

        
        return "SUCCESS";
    }

@Validated 开启校验
BasicArea.update.class 开启分组校验,只有分组是 update的时候,才会校验,其他不加分组的字段,正常校验
本文中: id 在此处会做@NotBlank的判断

2.

不明确当前接口方法(修改增加为同一个接口)

需要通过判断当前是新增还是修改,改造如下; 新增同理

  @Autowired
    private ValidatorFactory validatorFactory;

    @RequestMapping("/validate")
    public Object validate(@RequestBody BasicArea basicArea) {
    
        Set<ConstraintViolation<BasicArea>> validate = validatorFactory.getValidator().validate(basicArea, BasicArea.update.class);
        for (ConstraintViolation<BasicArea> basicAreaConstraintViolation : validate) {
            System.out.println(basicAreaConstraintViolation.getPropertyPath() + basicAreaConstraintViolation.getMessage() + basicAreaConstraintViolation.getInvalidValue());
        }
        return "SUCCESS";
    }

例如经过判断为修改,通过此种方式校验;
如Set validate集合不为空,则校验不通过;


总结

以上就是Validate中的分组校验,能达到相对复杂的业务校验逻辑,也无需创建多余的实体入参类了,分组校验,逼格更高~~
快来试试吧!!

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。