Spring Boot 3.1.5升级至3.2.0后出现IllegalStateException: No target Validator set
Spring Boot 3.2.0响应式应用升级后"No target Validator set"异常解决
问题重现
将响应式Spring Boot应用从3.1.5升级到3.2.0后,出现如下异常:
java.lang.IllegalStateException: No target Validator set at org.springframework.util.Assert.state(Assert.java:76) at org.springframework.validation.beanvalidation.SpringValidatorAdapter.forExecutables(SpringValidatorAdapter.java:396) at org.springframework.validation.beanvalidation.MethodValidationAdapter.invokeValidatorForArguments(MethodValidationAdapter.java:257) at org.springframework.validation.beanvalidation.MethodValidationAdapter.validateArguments(MethodValidationAdapter.java:240) at org.springframework.web.method.annotation.HandlerMethodValidator.validateArguments(HandlerMethodValidator.java:115) at org.springframework.web.method.annotation.HandlerMethodValidator.applyArgumentValidation(HandlerMethodValidator.java:83) at org.springframework.web.reactive.result.method.InvocableHandlerMethod.lambda$invoke$0(InvocableHandlerMethod.java:164) ...
无其他代码变更,该异常在3.1.5版本中未出现。
问题原因
Spring Boot 3.2.0对依赖管理和方法校验逻辑做了调整:
spring-boot-starter-webflux不再默认包含spring-boot-starter-validation依赖,导致容器中缺少Validator相关Bean;- 方法校验的自动配置逻辑更严格,若容器中无可用的Validator实例,会直接抛出异常(3.1.5版本存在默认 fallback 逻辑)。
解决方案
1. 显式引入Validation Starter依赖
如果项目中没有明确添加validation依赖,需要在构建配置中引入:
Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Gradle:
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. 显式配置Validator Bean(可选,若引入依赖后仍报错)
在配置类中定义LocalValidatorFactoryBean Bean,确保容器中存在可用的Validator实例:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; @Configuration public class ValidatorConfig { @Bean public LocalValidatorFactoryBean validator() { return new LocalValidatorFactoryBean(); } }
3. 检查自定义方法校验配置
若项目中存在自定义的MethodValidationPostProcessor或相关校验配置,需确保其正确注入Validator实例:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; @Configuration public class MethodValidationConfig { @Bean public MethodValidationPostProcessor methodValidationPostProcessor(LocalValidatorFactoryBean validator) { MethodValidationPostProcessor processor = new MethodValidationPostProcessor(); processor.setValidator(validator); return processor; } }
验证
完成上述调整后,重启应用并触发之前报错的接口,异常应消失。
内容的提问来源于stack exchange,提问作者Honza Zidek
相关产品推荐
相关产品推荐

