Spring Boot自定义Validator注解对请求参数不生效如何解决
自定义校验注解不生效的原因及解决方法
1. 核心问题:未引入校验依赖
Spring Boot 2.3及以上版本中,spring-boot-starter-web已经默认移除了校验相关的依赖包,你的pom.xml中没有引入校验启动器,导致整套校验逻辑没有被触发。
解决方式:在pom.xml的dependencies节点中添加如下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2. 冗余注解干扰(优化项,非必改但建议调整)
你的控制器类上同时标注了@RestController和@Controller,@RestController本身已经包含了@Controller的功能,重复标注可能导致AOP代理逻辑异常,影响@Validated的切面生效,建议删除冗余的@Controller注解。
3. 校验逻辑写法优化(建议调整,避免异常处理异常)
你当前在isValid方法中直接抛出IllegalArgumentException的写法不符合JSR-380校验规范,正常场景下校验失败直接返回false即可,框架会自动抛出ConstraintViolationException。你需要在全局异常处理器中新增该异常的捕获规则,才能返回预期的400错误码,而不是走到默认的500异常分支。
优化后的校验器代码:
public class ValueValidator implements ConstraintValidator<ValidValue, String> { @Override public void initialize(ValidValue constraintAnnotation) { ConstraintValidator.super.initialize(constraintAnnotation); } @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { // 空值如果需要拦截可以调整判断逻辑 if (s == null) { return true; } return !s.contains("hello"); } }
全局异常处理器新增捕获规则:
@ExceptionHandler(ConstraintViolationException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public ErrorMessage constraintViolationExceptionHandler(ConstraintViolationException ex) { LOG.error(ex.getMessage()); String errorMsg = ex.getConstraintViolations().stream() .map(ConstraintViolation::getMessage) .collect(Collectors.joining(";")); return getErrorMessage(new RuntimeException(errorMsg), ErrorCode.INVALID_INPUT_ERROR); }
完成以上调整后,重新启动项目即可触发自定义校验逻辑。
内容的提问来源于stack exchange,提问作者mr.Penguin
相关产品推荐
相关产品推荐

