文档中心文档中心
开发指南
开发工具
前端
开发指南
开发工具
前端
  • 开发指南
  • 全局状态码
  • 响应结果封装
  • 全局异常处理
  • 参数校验
  • SpringMVC使用LocalDateTime、LocalDate

参数校验

基本概念

从 springboot-2.3.x开始,spring-boot-starter-web不再引入 spring-boot-starter-validation,所以需要额外手动引入validation依赖,而 2.3之前的版本只需要引入 web 依赖。

@valid 与 @validate的区别

  • @Valid注解,是 Bean Validation 所定义,可以添加在普通方法、构造方法、方法参数、方法返回、成员变量上,表示它们需要进行约束校验。
  • @Validated注解,是 Spring Validation 所定义,可以添加在类、普通方法、方法参数上,表示它们需要进行约束校验

常用注解

注解功能
@NotBlank字符串不能为null,字符串trim()后也不能等于空字符串
@NotNull不能为null,可以是空
@NotEmpty不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于空字符串
@Length长度必须在指定范围内

基本使用

引入依赖

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

配置校验注解

@Data
@Schema(description = "客户")
public class CarRenterForm {

    /** 租车人 */
    @NotBlank(groups = UpdateValidationGroup.class, message = "请选择客户")
    private String openId;

    /** 租车人姓名 */
    @NotBlank(message = "租车人姓名不能为空")
    private String renterName;

    /** 手机号 */
    @NotBlank(message = "手机号不能为空")
    @Length(min = 18, max = 18, message = "手机号不合法")
    private String phone;

    /** 身份证号 */
    @NotBlank(message = "身份证号不能为空")
    @Length(min = 18, max = 18, message = "身份证号不合法")
    private String idCardNo;
}

在controller中开启校验

@RestController
public class RenterController {
    /**
     * 新增平台客户
     * 前面加@RequestBody注解时,校验失败时,抛MethodArgumentNotValidException异常
     */   
    @PostMapping
    public boolean add(@Validated @RequestBody CarRenterForm carRenter) {
        return carRenterService.insertCarRenter(carRenter);
    }

    /**
     * 新增平台客户
     * 没有添加@RequestBody,校验失败抛BindException异常
     */
    @PostMapping
    public boolean add(@Validated CarRenterForm carRenter) {
        return carRenterService.insertCarRenter(carRenter);
    }
}

GetMapping参数校验

controller增加validated注解

@Tag(name = "平台客户")
@Slf4j
@RestController
@RequestMapping("/rental/renter")
@RequiredArgsConstructor(onConstructor_ = {@Autowired})
@Validated
public class CarRenterController {
}

GetMapping参数接收

@GetMapping(value = "/{openId}")
public CarRenter getInfo(@NotBlank(message = "请选择客户") @PathVariable("openId") String openId) {
    return carRenterService.selectCarRenterByOpenId(openId);
}

GetMapping对象接收

嵌套校验

分组校验

同一属性在新增时允许为空、在修改时不允许为空,此时就需要条件/分组校验

service方法校验

更多情况下是需要对Service层的接口进行参数校验的,那么该如何配置呢?在校验方法入参的约束时,如果是@Override父类或接口的方法,入参约束只能写在父类或接口上面。示例如下:

@Validated
public interface UserService {
 
    @Validated(value = UserValidatedGroup.Create.class)
    int save(@Valid UserVo user);
 
    UserVo get(@Min(message = "id无效", value = 1) int id);
}

自定义校验规则

自定义校验规则比如手机号校验、身份证号校验、枚举参数校验、集合校验

上次更新:
Prev
全局异常处理
Next
SpringMVC使用LocalDateTime、LocalDate