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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:47:20