Spring Boot 3整合Jakarta Validation:如何默认启用分组校验序列
Spring Boot 3整合Jakarta Validation:如何默认启用分组校验序列
我太懂你这种不想每次都手动指定校验分组的麻烦了——重复写validator.validate(data, AllValidations.class)确实啰嗦,咱们可以通过全局配置或者局部注解的方式,让Spring自动启用你的分组校验序列,不用每次都手动指定。
方法一:全局配置默认校验分组序列
Spring Boot默认使用LocalValidatorFactoryBean来处理Jakarta Validation,咱们可以自定义这个Bean,把默认的校验分组序列设置成你定义的AllValidations,这样整个应用里所有的默认校验都会自动遵循这个序列(先跑Default,再跑AfterDefaultValidations)。
代码示例如下:
import jakarta.validation.Validator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import java.util.Map; @Configuration public class ValidationConfig { @Bean public LocalValidatorFactoryBean validator() { LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean(); // 设置默认分组序列为你的AllValidations接口(注意要写全限定类名) factoryBean.setValidationPropertyMap(Map.of( "jakarta.validation.default-group-sequence", "com.yourpackage.AllValidations" )); return factoryBean; } }
注意替换com.yourpackage.AllValidations为你实际的接口全限定名,这样不管是在Controller用@Valid,还是在Service用@Validated(不指定分组),都会自动按照你定义的序列执行校验。
方法二:局部指定(适合特定场景)
如果不想全局生效,只想在某个Controller或者Service里启用这个序列,可以直接在类上加上@Validated(AllValidations.class),这样该类下所有的@Valid校验都会自动使用这个分组序列:
import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController @Validated(AllValidations.class) public class MyController { @PostMapping("/submit") public void handleData(@RequestBody @Valid MyData data) { // 这里的校验会自动先执行Default分组,再执行AfterDefaultValidations分组 } }
这种方式适合只需要在特定模块生效的场景,不用改全局配置。
这样调整后,你就不用再每次手动调用validator.validate并指定分组了,Spring会自动帮你按序列执行校验,完美解决重复代码的问题~
备注:内容来源于stack exchange,提问作者Elias Schoof
相关产品推荐
相关产品推荐

