Spring Boot中校验Angular提交form-data对应的无@Entity注解UserDto的方法
解决方案
Spring Boot完全支持对form-data参数绑定的非实体DTO类做参数校验,你当前校验不生效是参数绑定注解配置缺失导致的,按以下步骤修改即可:
步骤1:补充Controller参数的@ModelAttribute注解
form-data类型的请求不能用@RequestBody(仅支持JSON/XML等结构化请求体),需要在DTO参数前添加@ModelAttribute注解,触发Spring的表单参数绑定逻辑,同时激活@Valid校验:
@PostMapping public ResponseEntity<Object> save(@Valid @ModelAttribute UserDto userDto, @RequestPart("file") MultipartFile file) throws IOException { service.save(userDto.convertToUser(userDto, file.getOriginalFilename()), file); return new ResponseEntity<>(HttpStatus.CREATED); }
步骤2:检查校验依赖引入
Spring Boot 2.3及以上版本,校验组件不再默认集成,需要手动引入spring-boot-starter-validation依赖:
Maven配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Gradle配置:
implementation 'org.springframework.boot:spring-boot-starter-validation'
步骤3:(可选)添加全局校验异常处理器
配置后空表单提交会直接触发MethodArgumentNotValidException,不会进入业务转换逻辑,你可以添加全局异常处理器统一返回校验错误信息:
@RestControllerAdvice public class GlobalValidationExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<Map<String, String>> handleValidationError(MethodArgumentNotValidException e) { Map<String, String> errorMap = new HashMap<>(); e.getBindingResult().getFieldErrors().forEach(error -> errorMap.put(error.getField(), error.getDefaultMessage()) ); return ResponseEntity.badRequest().body(errorMap); } }
修改完成后提交空表单会直接返回对应字段的校验错误,不会进入convertToUser方法触发User类相关异常。
内容的提问来源于stack exchange,提问作者kushinier
相关产品推荐
相关产品推荐

