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

REST请求参数验证失效:Worker实体name字段校验不生效

解决Spring Boot中@Valid校验不生效的问题

以下是针对你的场景,校验未生效的常见原因及解决办法:

1. 缺失校验依赖

Spring Boot 2.3.x及以后版本,spring-boot-starter-web不再包含校验依赖,必须单独引入:

  • Maven依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  • Gradle依赖:
implementation 'org.springframework.boot:spring-boot-starter-validation'

2. 未主动处理校验错误

仅添加@Valid和Errors参数是不够的,必须在Controller中判断校验结果,有错误时终止保存逻辑并返回响应:
错误写法(会跳过校验直接保存):

@PostMapping("/workers")
public ResponseEntity<Worker> saveWorker(@Valid @RequestBody Worker worker, Errors errors) {
    workerRepository.save(worker);
    return ResponseEntity.ok(worker);
}

正确写法:

@PostMapping("/workers")
public ResponseEntity<?> saveWorker(@Valid @RequestBody Worker worker, Errors errors) {
    if (errors.hasErrors()) {
        List<String> errorList = errors.getAllErrors().stream()
                .map(ObjectError::getDefaultMessage)
                .collect(Collectors.toList());
        return ResponseEntity.badRequest().body("员工无法保存:" + String.join(";", errorList));
    }
    Worker saved = workerRepository.save(worker);
    return ResponseEntity.ok(saved);
}

3. 注解使用不匹配场景

@NotNull仅校验字段是否为null,如果请求传入空字符串(""),该注解不会触发校验。要同时拦截null和空字符串,需改用@NotBlank注解:

public class Worker {
    @NotBlank(message = "员工姓名不能为空")
    private String name;
    // 其他字段...
}

4. 请求参数映射问题

确保请求参数(JSON/form-data)的键名与实体类字段名一致,若大小写或命名规则不同,可使用@JsonProperty指定映射关系:

public class Worker {
    @NotBlank(message = "员工姓名不能为空")
    @JsonProperty("Name") // 适配请求中大写的Name字段
    private String name;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:55:21