springboot-请求入参验证

本文介绍了如何在Spring Boot应用中使用JSR-303和@Validated进行请求参数验证,包括JSR-303的验证规则、@Validated的使用方法以及自定义验证规则和异常处理。通过示例展示了自定义验证注解@WorkOverTime和验证器的工作原理,以及如何统一处理验证失败的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Boot 支持 JSR-303 、 Bean 验证框架 , 默认实现用的是 Hibernate validator。在Spring MVC 中,只需要使用@Valid 注解标注在方法参数上, Spring Boot 即可对参数对象进行校验 ,校验结果放在BindingResult 对象中。

1. JSR-303验证规则

JSR-303 是 Java 标准的验证框架 , 己有的实现有 Hibernate validator . JSR-303 定义了一系列注解用来验证 Bean 的属性,常用的有如下几种。

空检查

  • @Null , 验证对象是否为空 ;
  • @NotNull , 验证对象不为空 ;
  • @NotBlank , 验证字符串不为空或者不是空字符串, 比如””和””都会验证失败;
  • @NotEmpty,验证对象不为null ,或者集合不为空;

长度检查

  • @Size(min=, max=),验证对象长度,可支持字符串、集合;
  • @Length , 字符串大小;

数值检测

  • @Min ,验证数字是否大于等于指定的值;
  • @Max ,验证数字是否小于等于指定的值;
  • @Digits , 验证数字是否符合指定格式,如@Digits(integer=9,台action=2);
  • @Range , 验证数字是否在指定的范围内,如@Range(min=1,max=100);

其他

  • @Email , 验证是否为邮件格式,为 null 则不做校验;
  • @Pattern, 验证 String 对象是否符合正则表达式的规则。

以下是一个包含了验证注解的 JavaBean:

import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Size;

/**
 * @Author ccl
 * @Date 2021/1/3 14:55
 */
@Data
public class User {
   

    @Null(groups = {
   Update.class},message = "id必须为空")//更新的时候必须为null
    @NotNull(groups = {
   Add.class},message = "id不能为空")//新增的时候必须不为null
    private Long id;
    @Size(min = 3, max = 20,message = "name长度必须在3到20之间")
    private String name;
    @Email(message = "email地址不合法")
    private String email;

    //定义一个group接口,更新时校验纽
    public interface Update {
   
    }

    //定义另一个group接口,添加时校验纽
    public interface Add {
   
    }
}

通常,不同的业务逻辑会有不同的验证逻辑,比如对于 User来说,当更新的时候,id 必须不为 null ,但增加的时候, id 必须是 null 。

JSR-303 定义了 group 概念,每个校验注解都必须支持。校验注解作用在宇段上的时候,可以指定一个或者多个 group , 当 Spring Boot 校验对象的时候,也可以指定校验的上下文属于哪个 group。这样 , 只有 group 匹配的时候,校验注解才能生效。

2.使用@Validated验证入参

在 Controller 中 , 只需要给方法参数加上@Validated 即可触发一次校验 。

参数使用了@Validated 注解,将触发 Spring 的校验 , 井将验证结果存放到 BindingResult 对象中 。 这里, Validated 注解使用了校验的上下文 User.Add.class , 因 此, 整个校验将按照 Add.class 来校验。

BindingResult 包含了验证结果,提供了如下方法 :

  • hasErrors ,判断验证是否通过 :
  • getAllErrors ,得到所有的错误信息,通常返回的是 FieldError 列表。

方式一:手动处理验证结果

如果 Controller 参数未提供 BindingResult 对象, 则 SpringMVC 将抛出异常。

import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值