Javax @Size约束未生效于JSON请求体的问题排查
问题原因
单元测试能正常触发校验是因为手动创建了ValidatorFactory,它会自动扫描classpath中的校验实现;但Spring MVC上下文里缺少JSR-380校验的具体实现依赖,且未正确配置校验器,导致接口的@Valid注解未生效。
解决方案
1. 补充校验实现依赖
你的pom.xml仅引入了JSR-380的规范API(validation-api),缺少具体实现(Hibernate Validator是最常用的实现)。在<dependencies>中添加以下依赖:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.5.Final</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>6.2.5.Final</version> </dependency>
版本说明:Spring 5.3.x对应Hibernate Validator 6.x系列,与你使用的
validation-api 2.0.1.Final兼容。
2. 配置Spring MVC校验器
如果使用Java配置类,添加以下配置让Spring加载校验器:
@Configuration @EnableWebMvc public class WebMvcConfig implements WebMvcConfigurer { @Override public Validator getValidator() { return new LocalValidatorFactoryBean(); } }
如果使用XML配置,添加:
<mvc:annotation-driven validator="validator"/> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
3. 全局捕获校验异常(可选但推荐)
添加全局异常处理器,将校验失败的信息以友好格式返回:
@ControllerAdvice public class ValidationErrorHandler { @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public Map<String, String> handleValidationErrors(MethodArgumentNotValidException ex) { Map<String, String> errorMap = new HashMap<>(); ex.getBindingResult().getAllErrors().forEach(error -> { String field = ((FieldError) error).getField(); String message = error.getDefaultMessage(); errorMap.put(field, message); }); return errorMap; } }
4. 验证配置
重新启动服务后,用Postman/Curl传入超过25个文档的请求,此时接口会返回400 Bad Request,并携带你定义的错误信息,同时不会执行文档创建逻辑。
内容的提问来源于stack exchange,提问作者Ricco E
相关产品推荐
相关产品推荐

