news 2026/4/14 2:53:33

9个Spring Boot参数验证高阶技巧,第8,9个代码量直接减半!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
9个Spring Boot参数验证高阶技巧,第8,9个代码量直接减半!

9 个 Spring Boot 参数验证高阶技巧(2025–2026 实战版)

Spring Boot 的参数验证(Bean Validation + Hibernate Validator)早已不是简单的@NotNull@Size,下面这些高阶用法可以让你的代码更简洁、更统一、更易维护,尤其是第 8、9 个技巧,真的能把代码量砍一半甚至更多。

1. 自定义复合注解(最常用高阶技巧)

把多个校验规则打包成一个注解,复用性暴增。

@Target({ElementType.FIELD,ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy=PhoneNumberValidator.class)@Documentedpublic@interfacePhoneNumber{Stringmessage()default"手机号格式不正确";Class<?>[]groups()default{};Class<?extendsPayload>[]payload()default{};}
publicclassPhoneNumberValidatorimplementsConstraintValidator<PhoneNumber,String>{privatestaticfinalPatternPATTERN=Pattern.compile("^1[3-9]\\d{9}$");@OverridepublicbooleanisValid(Stringvalue,ConstraintValidatorContextcontext){returnvalue!=null&&PATTERN.matcher(value).matches();}}

使用:

@PostMapping("/register")publicResponseregister(@RequestBody@ValidatedRegisterDTOdto){// ...}
publicclassRegisterDTO{@PhoneNumberprivateStringphone;}

2. @Valid + @Validated 的正确组合使用

  • @Valid:用于对象字段嵌套校验(JSR-303 标准)
  • @Validated:Spring 增强版,支持分组校验、类级别校验
publicclassOrderCreateDTO{@NotNullprivateLonguserId;@Valid// 嵌套校验privateList<OrderItemDTO>items;}@PostMapping("/orders")publicvoidcreate(@RequestBody@Validated(Group.Create.class)OrderCreateDTOdto){// ...}

3. 分组校验(Group Validation)——同一个 DTO 不同场景不同规则

publicinterfaceCreate{}publicinterfaceUpdate{}publicclassUserDTO{@Null(groups=Create.class)// 创建时 id 必须为空@NotNull(groups=Update.class)// 更新时 id 必须有privateLongid;@NotBlank(groups={Create.class,Update.class})privateStringusername;}
@PostMapping("/users")publicvoidcreate(@Validated(Create.class)UserDTOdto){...}@PutMapping("/users/{id}")publicvoidupdate(@Validated(Update.class)UserDTOdto){...}

4. 类级别校验(Class-level validation)

校验整个对象,而非单个字段。

@ScriptAssert(lang="javascript",script="_this.startDate.before(_this.endDate)",message="结束时间不能早于开始时间")publicclassActivityDTO{privateLocalDatestartDate;privateLocalDateendDate;}

或者更推荐自定义 Constraint:

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy=DateRangeValidator.class)public@interfaceDateRange{Stringmessage()default"结束时间不能早于开始时间";// ...}

5. @JsonView + 校验分组联动

结合@JsonView和分组校验,实现“不同接口不同字段 + 不同校验规则”。

publicinterfaceViews{interfaceCreate{};interfaceUpdate{};}publicclassUserDTO{@Null(groups=Views.Create.class)@NotNull(groups=Views.Update.class)@JsonView({Views.Create.class,Views.Update.class})privateLongid;}

6. MethodValidationPostProcessor 开启方法参数/返回值校验

@ConfigurationpublicclassValidationConfig{@BeanpublicMethodValidationPostProcessormethodValidationPostProcessor(){MethodValidationPostProcessorprocessor=newMethodValidationPostProcessor();processor.setValidator(Validation.buildDefaultValidatorFactory().getValidator());returnprocessor;}}

然后在 Controller/Service 直接用:

@Validated@RestControllerpublicclassUserController{@PostMapping("/users")publicUsercreateUser(@Valid@RequestBodyUserDTOdto){// ...}}

7. 自定义全局异常处理器 + 统一错误响应

@RestControllerAdvicepublicclassGlobalExceptionHandler{@ExceptionHandler(ConstraintViolationException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)publicRhandleConstraintViolation(ConstraintViolationExceptione){List<String>errors=e.getConstraintViolations().stream().map(v->v.getMessage()).toList();returnR.error(400,"参数校验失败",errors);}@ExceptionHandler(MethodArgumentNotValidException.class)publicRhandleMethodArgumentNotValid(MethodArgumentNotValidExceptione){List<String>errors=e.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).toList();returnR.error(400,"参数校验失败",errors);}}

8. 使用 @Validated + Record(代码量直接砍一半!)

Java 14+ Record + 校验 = 极简 DTO

@ValidatedpublicrecordUserCreateRequest(@NotBlank(message="用户名不能为空")@Size(min=4,max=20)Stringusername,@NotBlank@EmailStringemail,@PhoneNumberStringphone){}

Controller 直接用:

@PostMapping("/users")publicvoidcreate(@ValidUserCreateRequestrequest){// request.username() 访问}

对比传统:省去 getter/setter、equals/hashCode、toString,代码量直接减半以上。

9. 使用 hibernate-validator 内置的 @ParameterNameProvider + @ConstraintValidatorContext 动态消息

终极简化:字段名自动映射中文提示

@ConfigurationpublicclassValidationConfig{@BeanpublicValidatorvalidator(){ValidatorFactoryfactory=Validation.byDefaultProvider().configure().parameterNameProvider(newCustomParameterNameProvider()).buildValidatorFactory();returnfactory.getValidator();}staticclassCustomParameterNameProviderimplementsParameterNameProvider{@OverridepublicList<String>getParameterNames(Constructor<?>constructor){returnArrays.stream(constructor.getParameters()).map(p->p.isAnnotationPresent(NotBlank.class)?"用户名":p.getName()).toList();}// ...}}

更推荐:直接用@Property或自定义MessageInterpolator

但最直接省代码的方式还是第 8 点:Record + @Validated

总结:最值得立刻掌握的三个

  • 第 1:自定义复合注解(复用性最高)
  • 第 3:分组校验(同一个 DTO 多种场景)
  • 第 8:Record + @Validated(代码量直接减半,强烈推荐!)

你项目里现在是用传统 DTO 还是已经开始用 Record 了?
或者在校验上遇到过哪些最头疼的场景?可以告诉我,我帮你针对性给出更优解法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 13:41:36

百科——光伏气象站

问&#xff1a;光伏项目气象站的核心定位是什么&#xff1f;为什么说它是电站运维的“智慧之眼”&#xff1f; 答&#xff1a;核心定位是光伏电站专属气象监测终端&#xff0c;主打“精准监测、稳定运行、无人值守”&#xff0c;之所以被称为电站运维的“智慧之眼”&#xff0…

作者头像 李华
网站建设 2026/4/6 21:28:59

单片机嵌入式试题(第31期)你对它如何理解?我帮你打通三维数组的“经脉“(理解)!其实多层结构体差不多,只是元素的数据类型不一样,举例多层结构体说明。

多层结构体和三维数组有相似之处&#xff0c;只是每个维度的数据类型可以不同。让我用多层结构体来类比&#xff1a; 1. 基础对比&#xff1a;数组 vs 结构体 // 三维数组&#xff1a;所有元素类型相同 int arr[2][3][4]; // 全是int类型// 多层结构体&#xff1a;每层可以不…

作者头像 李华
网站建设 2026/4/10 17:23:32

前端HTML转PDF的两种主流方案深度解析

前端 HTML 转 PDF 的两种主流方案深度解析&#xff08;2026 年版&#xff09; 目前前端生成 PDF 最主流的两种方案是&#xff1a; 客户端方案&#xff1a;html2canvas jsPDF&#xff08;或其封装库 html2pdf.js&#xff09;服务端方案&#xff1a;Puppeteer / Playwright&am…

作者头像 李华
网站建设 2026/4/10 17:23:32

HoRain云--FreeSWITCH容器化全流程指南

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…

作者头像 李华
网站建设 2026/4/13 12:24:10

ON-BRIGHT昂宝 OB2281AMP SOT23-6 AC-DC控制器和稳压器

特性正常工作时&#xff0c;PWM开关频率在内部固定&#xff0c;并微调至较窄范围。在空载或轻载条件下&#xff0c;IC以扩展“突发模式”运行&#xff0c;以最小化开关损耗。VCC低启动电流和低工作电流有助于实现可靠的上电启动和低待机设计。提供全面的保护功能&#xff0c;并…

作者头像 李华
网站建设 2026/4/8 4:24:50

AI写论文的秘密武器!4款AI论文写作工具,搞定各类论文写作

在2025年&#xff0c;随着学术写作逐渐走向智能化&#xff0c;越来越多的人开始依赖AI写论文的工具。这些工具在撰写硕士、博士论文等较长的学术作品时&#xff0c;常常面临着理论深度不足或是逻辑不严密的问题。普通的AI论文写作工具并不能满足专业领域的学术需求。 许多使用…

作者头像 李华