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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:06:03