目录一、maven 依赖二、全局异常处理1.定义通用返回类2.全局异常处理类三、Valid / Validated1.Valid最常用2.ValidatedSpring 提供增强版四、常见校验注解1. NotNull最基础2. NotEmpty比 NotNull 严格一点3. NotBlank字符串专用最常用4. Length字符串长度Hibernate 扩展5. Size通用长度校验6. Min / Max数值范围7. Positive / PositiveOrZero推荐8. Email邮箱校验9. Pattern正则校验强力10. AssertTrue / AssertFalse五、测试1.post 接口2.get 请求一、maven 依赖对于 Spring Boot 2.x :dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId/dependency对于 Spring Boot 3.xJakarta 包名:依赖不变但代码里引用的包名发生变化javax.validation.* → jakarta.validation.*如果没引入这个依赖Valid 不生效校验注解写了等于没写二、全局异常处理全局异常处理用于参数校验失败以及业务异常时将接口错误信息返回1.定义通用返回类publicclassApiResultT{privateintcode;privateStringmessage;privateTdata;publicstaticTApiResultTfail(Stringmessage,Tdata){returnnewApiResult(400,message,data);}publicApiResult(){}publicApiResult(intcode,Stringmessage,Tdata){this.codecode;this.messagemessage;this.datadata;}publicintgetCode(){returncode;}publicvoidsetCode(intcode){this.codecode;}publicStringgetMessage(){returnmessage;}publicvoidsetMessage(Stringmessage){this.messagemessage;}publicTgetData(){returndata;}publicvoidsetData(Tdata){this.datadata;}}2.全局异常处理类importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;importjavax.validation.ConstraintViolationException;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;RestControllerAdvicepublicclassGlobalExceptionHandler{/** RequestBody 校验失败 **/ExceptionHandler(MethodArgumentNotValidException.class)publicApiResultListMapString,StringhandleMethodArgumentNotValid(MethodArgumentNotValidExceptionex){ListMapString,Stringerrorsex.getBindingResult().getFieldErrors().stream().map(e-{MapString,StringmnewHashMap();m.put(field,e.getField());m.put(message,e.getDefaultMessage());returnm;}).collect(Collectors.toList());returnApiResult.fail(参数校验失败,errors);}/** RequestParam / PathVariable 校验失败 **/ExceptionHandler(ConstraintViolationException.class)publicApiResultListMapString,StringhandleConstraintViolation(ConstraintViolationExceptionex){ListMapString,Stringerrorsex.getConstraintViolations().stream().map(v-{MapString,StringmnewHashMap();// propertyPath 形如get.id / method.arg0m.put(field,v.getPropertyPath().toString());m.put(message,v.getMessage());returnm;}).collect(Collectors.toList());returnApiResult.fail(参数校验失败,errors);}}三、Valid / Validated1.Valid最常用importjakarta.validation.Valid;作用触发校验本身不定义规则常见位置Controller 方法参数、成员变量级联校验示例PostMapping(/add)publicvoidadd(RequestBodyValidUserDTOdto){}没有 ValidUserDTO 里的所有校验注解都不会执行2.ValidatedSpring 提供增强版importorg.springframework.validation.annotation.Validated;特点支持分组校验可用在 类、方法上示例ValidatedRestControllerpublicclassUserController{}90% 场景用 Valid 即可四、常见校验注解1. NotNull最基础含义不能为 null可以是空字符串 “”适用类型所有对象类型Integer、Long、String、List…NotNull(message用户ID不能为空)privateLonguserId;2. NotEmpty比 NotNull 严格一点含义不能为 null不能为 “”集合不能是空集合适用类型StringCollection / Map / ArrayNotEmptyprivateStringname;NotEmptyprivateListStringroles;3. NotBlank字符串专用最常用含义不能为 null不能为 “”不能是 空白适用类型适用于 StringNotBlank(message用户名不能为空)privateStringusername;4. Length字符串长度Hibernate 扩展适用类型只能用于 Stringimportorg.hibernate.validator.constraints.Length;Length(min6,max20,message长度必须在6-20位之间)privateStringpassword;5. Size通用长度校验Size(min1,max5)privateListLongids;适用类型StringCollectionMapArray与 Length 区别注解 适用范围Length : StringHibernateSize : String 集合标准6. Min / Max数值范围Min(1)Max(100)privateIntegerage;⚠️ 不能校验字符串7. Positive / PositiveOrZero推荐Positive// 0PositiveOrZero// 0PositiveprivateLongamount;8. Email邮箱校验Email(message邮箱格式不正确)privateStringemail;9. Pattern正则校验强力Pattern(regexp^1[3-9]\\d{9}$,message手机号格式错误)privateStringphone;10. AssertTrue / AssertFalseAssertTrueprivateBooleanagree;五、测试importorg.hibernate.validator.constraints.Length;importjavax.validation.Valid;importjavax.validation.constraints.Email;importjavax.validation.constraints.Min;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.NotEmpty;importjavax.validation.constraints.NotNull;importjavax.validation.constraints.Positive;importjava.util.List;publicclassStudent{NotBlank(message用户名不能为空)privateStringname;NotBlank(messagestuendId不能为空)Length(min6,max20,messagestuendId长度必须在6-20位之间)privateStringstuendId;NotNull(messageteacherName不能为null)privateStringteacherName;Min(value18,message年龄必须大于18岁)privateIntegerage;Email(message邮箱格式不正确)privateStringemail;Positive(messageamount要大于0)privateLongamount;NotEmpty(messageroles不能为空)privateListStringroles;/** 级联校验如果要校验这个列表里的 Address 对象必须加 Valid **/NotNull(message地址列表不能为空)ValidprivateListSendMessageModeladdresses;//省略get、set 方法}importorg.hibernate.validator.constraints.Length;importjavax.validation.constraints.NotBlank;publicclassSendMessageModel{NotBlank(messagemobile不能为空)Stringmobile;Length(min6,max20,messagesign长度必须在6-20位之间)Stringsign;NotBlank(messagecontent不能为空)Stringcontent;//省略get、set 方法}1.post 接口importcom.xiaohaitang.somedemo.exception.Student;importorg.springframework.web.bind.annotation.*;importjavax.validation.Valid;RestControllerRequestMapping(value/apiList)publicclassUsercontroller{PostMapping(value/v1/addStudents)publicStringvalidChechaAddStudents(RequestBodyValidStudentstudent){returnsuccess;}}入参{age:0,email:string,amount:0,addresses:[{}]}响应{code:400,message:参数校验失败,data:[{field:teacherName,message:teacherName不能为null},{field:email,message:邮箱格式不正确},{field:addresses[0].mobile,message:mobile不能为空},{field:amount,message:amount要大于0},{field:age,message:年龄必须大于18岁},{field:name,message:用户名不能为空},{field:addresses[0].content,message:content不能为空},{field:stuendId,message:stuendId不能为空},{field:roles,message:roles不能为空}]}2.get 请求必须在类上增加Validated参数里的校验才会生效importorg.hibernate.validator.constraints.Length;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.*;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.NotNull;importjavax.validation.constraints.Positive;Validated// 必须启用方法参数校验RestControllerRequestMapping(value/apiList)publicclassUsercontroller{GetMapping(/test)publicStringtest(RequestParamNotBlank(messagename 不能为空)Length(min6,max20,messagename长度必须在6-20位之间)Stringname,RequestParamNotNull(messageid 不能为空)Positive(messageid 必须大于 0)Longid){returnsuccess;}}入参http://localhost:8080/apiList/test?id0nameaaa响应{code:400,message:参数校验失败,data:[{field:test.id,message:id 必须大于 0},{field:test.name,message:name长度必须在6-20位之间}]}