news 2026/9/13 12:14:08

OpenAPI Generator 升级到 7.25 后 Jackson 注解(@JsonInclude/@JsonSetter)行为变化怎么处理?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenAPI Generator 升级到 7.25 后 Jackson 注解(@JsonInclude/@JsonSetter)行为变化怎么处理?

OpenAPI Generator 升级到 7.25 后 Jackson 注解(@JsonInclude/@JsonSetter)行为变化怎么处理?

【免费下载链接】openapi-generatorOpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)项目地址: https://gitcode.com/GitHub_Trending/op/openapi-generator

如果你用 OpenAPI Generator 的springkotlin-spring生成器产出模型代码,把生成器版本升到7.25.0后需要回答一个问题:模型属性上的 Jackson 注解要保留还是去掉。背景是这样的:7.24.0开始,这两个生成器会在模型属性上输出字段级注解——用于序列化的@JsonInclude(...),以及用于反序列化、针对 optional 且非 nullable 属性的@JsonSetter(nulls = ...)(见 迁移指南)。字段级@JsonInclude会覆盖项目全局的ObjectMapperinclusion 策略(例如spring.jackson.default-property-inclusion=non_empty),导致升级项目的 wire 契约被静默改变。

7.25.0起,这些注解的输出改由两个独立的 opt-in 选项控制。选项不设置时,生成器回退到7.24.0之前(即7.23.0)的行为——不输出任何注解——并打印一条 warning,保证这个变化在传递性升级时可见;显式设置选项即可消除该警告。

两个开关及其取值含义

选项unset(默认)falsetrue
generateJsonIncludeAnnotations不输出@JsonInclude,inclusion 完全由全局ObjectMapper决定,打印 warning行为相同,但警告被消除输出 spec-honest 的@JsonInclude注解(required 字段契约保护 + 下述 optional 非 nullable 策略)
generateJsonSetterNullsAnnotations不输出@JsonSetter(nulls = ...),打印 warning行为相同,警告被消除对 optional 非 nullable 属性输出@JsonSetter(nulls = ...)

各有一个配套的策略选项,只在对应主开关为true时生效:

  • optionalNonNullPropertyJsonInclude(默认NON_NULL):optionalNonNullPropertyJsonInclude=true时,对 optional 非 nullable 属性输出的@JsonInclude策略,可选NON_NULL/NON_EMPTY/NON_DEFAULT/NONENONE表示不输出注解)。
  • optionalNonNullPropertyJsonSetterNulls(默认不设置):显式指定SKIP/FAIL模式,把它与openApiNullable解耦。不设置时,模式与7.24.x完全一致地由openApiNullable推导(true→ 支持处为FAILfalseSKIP)。显式设置后,之前不可达的组合也能做到——例如openApiNullable=true同时配SKIP:非 nullable 字段容忍 payload 中的显式null,而真正 nullable 的 optional 字段仍用JsonNullable<T>

两个开关的完整说明见 spring 生成器文档 和 kotlin-spring 生成器文档 的选项表。

恢复 7.23.0 的输出(不输出注解)

如果你的项目之前依赖全局ObjectMapper控制序列化和 null 处理,升到7.25.0时直接保持现状即可:两个选项 unset 时默认就不输出注解,只是每次生成会看到 warning。想消除警告,就显式把它们都设为false

CLI 方式:生成器专属选项通过--additional-propertieskey=value逗号分隔传入(见 CLI 用法):

openapi-generator-cli generate \ -i petstore.yaml \ -g spring \ -o out \ --additional-properties=generateJsonIncludeAnnotations=false,generateJsonSetterNullsAnnotations=false

选项也可以放进 JSON/YAML 配置文件,用-c config.json(或-c config.yaml)传入,不再写成长串--additional-properties

Maven 插件方式:先把插件升到7.25.0,再按 插件示例 中的configOptions写法传选项:

<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>7.25.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <inputSpec>${project.basedir}/swagger.yaml</inputSpec> <generatorName>spring</generatorName> <configOptions> <generateJsonIncludeAnnotations>false</generateJsonIncludeAnnotations> <generateJsonSetterNullsAnnotations>false</generateJsonSetterNullsAnnotations> </configOptions> </configuration> </execution> </executions> </plugin>

想保留注解时怎么开

如果你希望生成器输出 spec-honest 的注解,把对应开关显式设为true,并用配套选项微调 optional 非 nullable 属性的策略:

openapi-generator-cli generate \ -i petstore.yaml \ -g spring \ -o out \ --additional-properties=generateJsonIncludeAnnotations=true,optionalNonNullPropertyJsonInclude=NON_NULL,generateJsonSetterNullsAnnotations=true

kotlin-spring有一个需要特别注意的行为变化(见 迁移指南):在7.24.x中,optional 非 nullable 属性配openApiNullable=true生成时输出@JsonSetter(nulls = Nulls.FAIL),payload 中的显式null会被直接拒绝;从7.25.0起,该注解只在generateJsonSetterNullsAnnotations=true时才输出,选项 unset(或false)时显式null交给全局ObjectMapper处理。如果你的 API 依赖这种严格拒绝(例如 PATCH 语义),设generateJsonSetterNullsAnnotations=true即可恢复Nulls.FAIL行为。

单属性级别的覆盖

两个生成器都支持 vendor extension 做逐属性覆盖,且优先级高于上述所有选项:

  • x-jackson-json-include-policy(FIELD 级):手动指定该属性的@JsonInclude策略,取值ALWAYSNON_NULLNON_ABSENTNON_EMPTYNON_DEFAULTUSE_DEFAULTSCUSTOM,或NONE表示不输出注解。无论generateJsonIncludeAnnotations是什么值都会生效。
  • x-jackson-json-setter-nulls(FIELD 级):手动指定该属性的 null 处理,取值SKIP(忽略显式null,保留字段默认值)、FAIL(拒绝显式null)或NONE(不输出注解)。它优先于openApiNullable默认值和optionalNonNullPropertyJsonSetterNulls选项,并且即使generateJsonSetterNullsAnnotations未设置也会被尊重。

在 spec 中给特定属性加这些扩展,可以只在个别字段上做例外,而不是全局翻转注解策略。

结果验证

重新生成后,直接检查生成的模型源码:

  • 两个开关为false(或 unset)时,模型属性上不应再出现字段级@JsonInclude@JsonSetter(nulls = ...),序列化和 null 处理回到全局ObjectMapper
  • 选项 unset 时生成日志会打印 warning,显式设置后 warning 消失——这是判断"选项已生效、行为已明确声明"的直接信号;
  • 开关为true时,对应注解按配套策略出现在模型属性上。

两点语义边界要分清(迁移指南 原文强调):

  1. @JsonSetter(nulls = Nulls.SKIP)与"不输出@JsonSetter"不等价:不输出注解时 Jackson 回落到全局默认Nulls.SET,显式null会覆盖字段默认值;而Nulls.SKIP会忽略传入的null、保留默认值。在spring生成器且openApiNullable=true时,选项 unset 仍然不输出注解(与7.24.x一致)但会打 warning;需要明确控制就设optionalNonNullPropertyJsonSetterNulls=SKIP(保留默认值)或FAIL(拒绝 null)。
  2. @JsonInclude(NON_ABSENT)不再输出在JsonNullable<T>字段上:JsonNullable模块本身已经管理这些字段的 inclusion,注解是冗余的。

本文涉及的迁移说明出自 迁移指南 的 "From 7.24.x to 7.25.0 (java-spring / kotlin-spring)" 一节,覆盖范围是springkotlin-spring两个生成器;其他生成器是否有同类变化,该文档未作说明,不建议把上述开关套用到其他生成器上。

【免费下载链接】openapi-generatorOpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)项目地址: https://gitcode.com/GitHub_Trending/op/openapi-generator

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 12:13:55

智能信贷审批系统:架构设计与机器学习实践

1. 智能信贷审批系统的行业背景与核心价值信贷审批流程的智能化改造正在深刻重塑金融行业格局。传统人工审批模式平均需要3-7个工作日完成全流程&#xff0c;而智能审批系统能将这个时间压缩到分钟级。某股份制银行的实际案例显示&#xff0c;部署智能系统后审批效率提升40倍&a…

作者头像 李华
网站建设 2026/9/13 12:12:57

SAP Fiori Launchpad配置与权限管理实战指南

1. 项目概述&#xff1a;从SAP GUI到Fiori Launchpad的转型之路 在SAP生态系统中工作了十多年的老用户&#xff0c;应该都记得那个被事务码&#xff08;T-Code&#xff09;支配的时代。每天上班第一件事就是打开厚重的SAP GUI客户端&#xff0c;在命令行输入SE38、MM01、VA01这…

作者头像 李华
网站建设 2026/9/13 12:12:36

光热电站储热容量配置优化与经济性分析

1. 光热电站储热容量配置的背景与挑战光热发电技术&#xff08;CSP&#xff09;作为可再生能源领域的重要分支&#xff0c;近年来在全球范围内获得了快速发展。与传统光伏发电不同&#xff0c;光热电站通过聚光系统将太阳能转化为热能&#xff0c;再通过热力循环发电&#xff0…

作者头像 李华
网站建设 2026/9/13 12:11:24

TypeScript在AI Agent开发中的优势与实践

1. 为什么TypeScript成为AI Agent开发的首选语言在AI Agent开发领域&#xff0c;TypeScript近年来呈现出爆发式增长。根据GitHub官方统计&#xff0c;2025-2026年间新开源的AI Agent项目中&#xff0c;75%以上采用TypeScript/JavaScript技术栈。这种压倒性优势的形成并非偶然&a…

作者头像 李华
网站建设 2026/9/13 12:11:10

继电器选型避坑指南:从参数理解到工况匹配

1. 为什么“会用继电器”不等于“接上就能通电”&#xff1f;你有没有遇到过这种情况&#xff1a;手头有个标着“DC 12V 10A”的电磁继电器&#xff0c;线圈一通电&#xff0c;触点咔哒一声响&#xff0c;你以为万事大吉——结果接上负载后&#xff0c;不到半小时&#xff0c;继…

作者头像 李华