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
相关产品推荐
相关产品推荐

