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
相关产品推荐
相关产品推荐

