音频功放BTL配置热管理实战:从原理到PCB布局的完整指南
2026/7/24 8:44:25
在日常开发中,我们经常遇到同一个 DTO(数据传输对象)在不同场景下有不同校验规则的情况。
典型场景:用户管理
ID必须为空(因为是自增的),但Password必填。ID不能为空(指定改谁),但Password选填(不改就不传)。如果没有分组校验,我们通常有两种“笨办法”:
UserCreateReqVO和UserUpdateReqVO。@NotNull,全靠在 Service 层手写if (id == null)判断。分组校验(Groups)就是为了解决这个问题——用一个 DTO,搞定多种场景。
使用分组校验只需要三步:定义分组 -> 标记规则 -> 触发校验。
这只是一个普通的 Java 接口,不需要任何方法,它的唯一作用就是做一个“标签”。
publicclassUserReqVO{// 定义两个分组接口publicinterfaceCreate{}publicinterfaceUpdate{}}在校验注解中配置groups属性。
@DatapublicclassUserReqVO{@Schema(description="用户ID")@Null(groups=Create.class,message="新增时ID必须为空")@NotNull(groups=Update.class,message="修改时ID不能为空")privateLongid;@Schema(description="用户名")@NotBlank(message="用户名不能为空")// 没有指定 groups,属于默认分组 (Default)privateStringusername;@Schema(description="密码")@NotBlank(groups=Create.class,message="新增时密码不能为空")privateStringpassword;}这是最关键的一步。你必须告诉 Spring,当前这次请求,你要检查哪个分组。
注意:必须使用@Validated注解,@Valid不支持分组。
@RestController@RequestMapping("/user")publicclassUserController{// 场景 A:新增 -> 触发 Create 分组@PostMapping("/create")publicResultcreate(@RequestBody@Validated(UserReqVO.Create.class)UserReqVOreq){returnsuccess(userService.create(req));}// 场景 B:修改 -> 触发 Update 分组@PutMapping("/update")publicResultupdate(@RequestBody@Validated(UserReqVO.Update.class)UserReqVOreq){returnsuccess(userService.update(req));}}这里有一个初学者极容易踩的坑。
问题:
在上面的例子中,username字段只加了@NotBlank,没有加groups。
当你使用@Validated(Create.class)时,Spring 只会检查标记了Create.class的字段,username会被忽略!
解决方案:让分组接口继承Default
如果你希望在检查Create分组时,也顺便检查那些没有分组的默认字段,可以这样定义接口:
importjavax.validation.groups.Default;publicclassUserReqVO{// 让 Create 分组继承 Default 分组publicinterfaceCreateextendsDefault{}publicinterfaceUpdateextendsDefault{}}这样,@Validated(Create.class)就会同时检查:
Create的规则。Default)。除了在 Controller 自动校验,我们有时需要在 Service 层根据业务开关动态校验(例如:验证码开关)。
场景:系统配置了“开启验证码”开关。开启时校验,关闭时不校验。
代码示例:
@ServicepublicclassAuthService{@ResourceprivateValidatorvalidator;// 注入 Java 标准校验器publicvoidlogin(LoginReqVOreq){// 1. 动态判断业务开关if(isCaptchaEnabled()){// 2. 手动触发特定分组 (CodeEnableGroup) 的校验Set<ConstraintViolation<LoginReqVO>>errors=validator.validate(req,CodeEnableGroup.class);// 3. 如果有异常,手动抛出if(!errors.isEmpty()){thrownewServiceException("验证码不能为空");}}// ... 其他逻辑}}Validation Groups (分组校验)是 Spring Boot 开发中精简代码的神器。
interface GroupA {})。groups = GroupA.class。@Validated(GroupA.class)。validator.validate(obj, GroupA.class)。Default接口,避免漏掉通用校验规则。