validation校验 @NotNull @NotBlank及分组校验

2023-02-05 13:26:32

我们经常需要对接口的请求参数进行校验,在没有使用validation之前都是用if去做校验的,但这样通常需要写一长串的if语句,使代码看起来非常臃肿,即使将这些校验封装到一个方法或是类中,然后调用,但本质上并没有改变什么。
validation校验可以方便的解决上述问题,只需在请求参数的DTO类的属性上加上对应的注解。它就能帮助我们在执行接口方法之前提前进行参数校验。我们常用的校验如判空@NotNull @NotBlank,或是对参数的大小、长度等都能进行校验,甚至可以使用正则表达式。
使用时只需在DTO上加上注解

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

/**
 * @author TangHaiZhi
 * @date 2021/8/20
 */
@Data
@Api("行业")
public class IndustryDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private Long id;

    @NotBlank(message = "行业名称不能为空")
    @ApiModelProperty("行业名称")
    private String industryName;

    @ApiModelProperty("状态0-关闭 1-启用")
    private Long status;

    @ApiModelProperty("分页开始")
    private int page = 0;

    @ApiModelProperty("每页数据行数")
    private int size = 10;
}

再在对应的接口上加上注解@Valid

@ApiOperation(value = "新增行业")
@PostMapping(value = "/xxx/xxx/addIndustry",consumes = "application/json")
ResultModel<IndustryVO> addIndustry(@Valid @RequestBody IndustryDTO var1);

这样在调用新增接口时如果参数industryName为空或空字符串,validation会自动帮我们抛出校验错误:行业名称不能为空

分组校验

有些时候可能我们新增修改接口请求参数用到的是同一个实体作为入参,但是有些参数在新增时是不用的,在修改时却需要填写。比如主键id,这时候单纯的一个@NotNull注解并不能达成这样的要求,我们需要引入分组校验。
先定义两个组

public interface AddGroup {
}

public interface UpdateGroup {
}

然后将入参实体改造一下,给validation注解加上组

@Data
@Api("行业")
public class IndustryDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    @NotNull(message = "id不能为空", groups = UpdateGroup.class)
    private Long id;

    @NotBlank(message = "行业名称不能为空",groups = AddGroup.class)
    @NotBlank(message = "行业名称不能为空", groups = UpdateGroup.class)
    @ApiModelProperty("行业名称")
    private String industryName;

    @ApiModelProperty("状态0-关闭 1-启用")
    private Long status;

    @ApiModelProperty("分页开始")
    private int page = 0;

    @ApiModelProperty("每页数据行数")
    private int size = 10;
}

在接口上也需要声明本接口在校验时需要调用的是哪个组的校验规则

/**
 * @author TangHaiZhi
 * @date 2021/8/20
 */
@Api(value = "运营解决方案行业")
@Validated
@Feign(serviceName = "xxxService")
public interface OperationIndustryFeign {
    @ApiOperation(value = "新增行业")
    @Validated(AddGroup.class)
    @PostMapping(value = "/xxx/xxx/addIndustry",consumes = "application/json")
    ResultModel<IndustryVO> addIndustry(@Valid @RequestBody IndustryDTO var1);

    @ApiOperation(value = "修改行业")
    @Validated(UpdateGroup.class)
    @PostMapping(value = "/xxx/xxx/updateIndustry",consumes = "application/json")
    ResultModel<IndustryVO> updateIndustry(@Valid @RequestBody IndustryDTO var1);

    @ApiOperation(value = "查询全部行业")
    @PostMapping(value = "/xxx/xxx/queryIndustry",consumes = "application/json")
    ResultModel<List<IndustryVO>> queryIndustry(@RequestBody IndustryDTO var1);
}

这样在新增时会调用add组的校验规则去校验行业名称,在修改时会调用update组的校验规则去校验id和行业名称,而在查询时则不会进行任何校验

  • 作者:南城.南城
  • 原文链接:https://blog.csdn.net/m0_49558851/article/details/120158214
    更新时间:2023-02-05 13:26:32