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

OpenAPI Spring Generator生成DTO异常:必填可空字段带@NotNull注解

问题解答

1. 关于你的理解是否有误

你的理解完全正确。在OAS 3.0规范中:

  • required数组的作用是强制请求必须包含该字段,不限制字段值的内容;
  • nullable: true则表示该字段的值允许为null。

两者结合的场景下,生成的代码不应该带有@NotNull注解——这个注解会强制字段值非null,直接和“必填但可空”的需求冲突,属于插件默认生成逻辑的不合理之处。

2. 正确建模与代码生成配置

步骤1:确保OAS定义的正确性

先确认你的API schema写法符合规范,示例如下:

components:
  schemas:
    YourModel:
      type: object
      required:
        - id
        - name
      properties:
        id:
          type: integer
          format: int32
        name:
          type: string
          nullable: true

这里name字段同时出现在required数组中且设置了nullable: true,完全符合“必填但可空”的需求。

步骤2:调整Gradle OpenAPI插件配置

在build.gradle的openApiGenerate任务中,添加validateNullableFields: "false"配置项,让插件不为可空的必填字段生成@NotNull注解,同时保留其他验证逻辑:

openApiGenerate {
    // 保留你已有的基础配置(generatorName、inputSpec、outputDir等)
    configOptions = [
        useJsonNullable: "true", // 维持JsonNullable包装类型
        useBeanValidation: "true", // 保留非空字段的@NotNull验证
        validateNullableFields: "false" // 禁用可空字段的@NotNull注解生成
    ]
}
步骤3:验证效果

重新执行代码生成任务后,你会看到:

  • 必填且非空的字段(如示例中的id)依然带有@NotNull和@Required注解;
  • 必填且可空的字段(如示例中的name)仅带有@Required注解,用JsonNullable包装,此时就能正常接收{"id":0,"name":null}这类请求,同时确保字段必须存在(缺少字段时仍会触发验证)。

如果上述配置不生效,也可以尝试全局指定notNullAnnotation为空(但不推荐,会丢失所有非空字段的@NotNull验证):

configOptions = [
    useJsonNullable: "true",
    notNullAnnotation: ""
]

内容的提问来源于stack exchange,提问作者vkourt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:07:14