You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Validator框架@Min/@Max/@NotBlank校验注解不生效问题求助

Spring Validator 校验不生效问题修复方案

以下是对应场景的所有故障点与修复方式:

  • 依赖缺失导致校验完全不触发
    Spring Boot 2.3.0及以上版本中,校验组件不再默认随spring-boot-starter-web引入,未手动引入spring-boot-starter-validation依赖时,@Valid注解不会生效,这是该问题的最高发原因。
    Maven项目在pom.xml中添加如下依赖即可:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    
  • 校验注解使用错误
    你在UserDTO的字符串类型name字段上使用的@Min/@Max注解仅支持校验数值类型的大小,对字符串长度校验无任何效果,字符串长度校验需使用@Size注解,与CustomerDTO中的写法保持一致。
  • 手动实例化的对象不会自动触发校验
    控制器方法中通过new关键字手动创建的UserDTO对象不归Spring容器管理,即使字段上加了校验注解也不会被自动拦截校验。如果需要校验这类手动创建的对象,需注入Validator实例手动执行校验:
    @Autowired
    private Validator validator;
    
    @PostMapping(path = "/nameChange")
    public void update(@Valid @RequestBody CustomerDTO customerDTO){
        System.out.println(customerDTO.getName());
        UserDTO userDTO = new UserDTO();
        userDTO.setName(customerDTO.getName());
        // 手动触发校验
        Set<ConstraintViolation<UserDTO>> validateResult = validator.validate(userDTO);
        if (!validateResult.isEmpty()) {
            throw new ConstraintViolationException(validateResult);
        }
        System.out.println(userDTO.getName());
    }
    
  • 正则规则存在漏洞
    两个DTO中@Pattern注解配置的正则^[a-zA-Z0-9_]+缺少结束匹配符$,仅会校验字符串开头的字符是否合规,字符串后续部分即使包含特殊字符也会通过校验,需修正为^[a-zA-Z0-9_]+$才能实现全字符串匹配校验。
  • 补充说明
    校验触发后默认会抛出MethodArgumentNotValidException,未配置全局异常处理时接口会直接返回400状态码,可通过@RestControllerAdvice编写全局异常捕获逻辑,自定义错误信息的返回格式。如果引入依赖后入参校验依然不生效,请检查项目中是否存在自定义的@RequestBody参数解析器、全局拦截器,覆盖了Spring MVC默认的参数解析与校验逻辑。

内容的提问来源于stack exchange,提问作者arsenal_random_profile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:57:37