OpenAPI Generator Maven Plugin Spring字段校验(必填)失效问题
解决方案
1. 补充Bean Validation实现依赖
当前仅引入了validation-api(这是校验规范的API定义,无具体实现),需要添加Spring Boot默认的校验实现。推荐直接使用starter自动管理版本:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
若需手动指定版本,可添加Hibernate Validator依赖:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.5.Final</version> <!-- 适配Java 17的兼容版本 --> </dependency>
2. 确保API接口启用校验
由于配置了delegatePattern=true,需确认生成的代码满足以下要求:
- 生成的API接口类添加
@Validated注解 - 请求体参数带有
@Valid注解
若生成代码缺失这些注解,可手动补充:
- 在API接口类上添加
@Validated:
@Validated @Api(value = "xxx", tags = { "xxx" }) @RequestMapping(value = "/api") public interface XxxApi { // ... 接口方法 }
- 在Delegate实现类的方法参数前添加
@Valid:
@Override public ResponseEntity<Void> createXxx(@Valid @RequestBody Xxx body) { // 业务逻辑实现 }
3. 检查OpenAPI YAML约束定义
确保YAML中的校验规则定义正确:
components: schemas: Xxx: type: object required: - name # 标记必填字段 properties: name: type: string minLength: 2 # 最小长度限制 maxLength: 50 # 最大长度限制
生成的模型类应自动带有@NotNull、@Size(min=2, max=50)等注解,若未生成,需确认useBeanValidation=true已正确配置在插件的configOptions中。
4. 添加全局异常处理器(可选)
校验生效后,可通过全局异常处理器捕获校验错误,返回标准化响应:
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<Map<String, String>> handleBodyValidationErrors(MethodArgumentNotValidException ex) { Map<String, String> errors = new HashMap<>(); ex.getBindingResult().getAllErrors().forEach(error -> { String fieldName = ((FieldError) error).getField(); String errorMsg = error.getDefaultMessage(); errors.put(fieldName, errorMsg); }); return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); } @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity<Map<String, String>> handleParamValidationErrors(ConstraintViolationException ex) { Map<String, String> errors = new HashMap<>(); ex.getConstraintViolations().forEach(violation -> { String fieldName = violation.getPropertyPath().toString(); String errorMsg = violation.getMessage(); errors.put(fieldName, errorMsg); }); return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); } }
内容的提问来源于stack exchange,提问作者Jani
相关产品推荐
相关产品推荐

