新闻详情

新闻详情

首页 / 资讯中心 / 详情

swagger-codegen 生成 Java 客户端复杂 Map 模型实战:以 Petstore 的 MapTest 为例

发布时间:2026/10/7 5:56:41来源:尧图网络
swagger-codegen 生成 Java 客户端复杂 Map 模型实战:以 Petstore 的 MapTest 为例
开发工具代码生成API设计【免费下载链接】swagger-codegenswagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.项目地址https://gitcode.com/gh_mirrors/sw/swagger-codegen点击查看免费下载导读本篇文章以 swagger-codegen 仓库中 Petstore 示例的MapTest模型MapTest.md为完整样本系统讲解 OpenAPI 定义中的「嵌套 Map」MapString, MapString, String与「Map 值枚举」MapString, InnerEnum两种复杂类型是如何被模板驱动引擎翻译成 Java 客户端 POJO 的。读完本文你将掌握 Map 类属性的生成规则、字段名与SerializedName注解的映射关系、枚举值内嵌 Map 时的 Gson 适配器实现以及链式 setter 与putXxxItem方法的设计模式。一、MapTest 是什么一个专门用于测试 Map 类型生成的模型MapTest是 Petstore fake 接口规范中刻意设计的测试用模型。它的目的非常纯粹——验证 swagger-codegen 在面对复杂 Map 类型时能否生成正确、可用的客户端代码。它只包含两个属性恰好覆盖了两种最具代表性的 Map 场景NameTypeDescriptionNotesmapMapOfStringMapString, MapString, String[optional]mapOfEnumString[MapString, InnerEnum](#MapString, InnerEnum)[optional]从optional标记可以看出两个属性都不是必填项对应源码中字段的初始值均为null。说明文档中mapMapOfString的类型链接指向同目录下的 Map.md这是一个通用说明页当前仓库该示例下未提供独立文件实际类型以属性表内的MapString, MapString, String为准。二、从 OpenAPI 源定义看 Map 类型的原始描述要理解生成的 Java 代码先看它的上游——OpenAPI/Swagger 定义。在 Petstore fake 规范 petstorefake.yaml 中MapTest模型定义如下MapTest: type: object properties: map_map_of_string: type: object additionalProperties: type: object additionalProperties: type: string map_of_enum_string: type: object additionalProperties: type: string enum: - UPPER - lower这里的两个定义要点map_map_of_string是双层 additionalProperties外层type: object表示这是一个 MapadditionalProperties再声明值类型为object其内部又有一个additionalProperties: { type: string }。OpenAPI 中这种写法即等价于 Java 的MapString, MapString, String。map_of_enum_string是Map 值枚举additionalProperties的值类型为string并带有enum: [UPPER, lower]即 Map 的每个值都必须在枚举范围内等价于MapString, InnerEnum。值得注意的是yaml 源定义中有一段被注释掉的map_map_of_enummap of map of enum定义注释原文明确说明comment out the following (map of map of enum) as many language not yet support this许多语言尚不支持此特性故注释掉。这是仓库源码层面的真实限制证据——它解释了为什么 MapTest 只保留了两层 Map 与单层枚举 Map而没有出现枚举套 Map 套 Map的更复杂组合。三、生成产物概览MapTest.java 的类骨架swagger-codegen 依据上述 yaml 定义为 okhttp-gson 客户端生成了 MapTest.java。该文件位于samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/MapTest.java类声明为public class MapTest包含两个核心字段SerializedName(map_map_of_string) private MapString, MapString, String mapMapOfString null; SerializedName(map_of_enum_string) private MapString, InnerEnum mapOfEnumString null;生成逻辑非常直观yaml 中的属性名map_map_of_string下划线风格被转换为驼峰命名的 Java 字段mapMapOfString同时通过 Gson 的SerializedName注解保留原始 JSON 字段名保证序列化/反序列化时与 API 的 JSON 报文完全对齐。四、属性详解一mapMapOfString——嵌套 Map 的生成mapMapOfString的类型为MapString, MapString, String即外层 Map 的每个 value 又是一个 Map。这是 OpenAPI 双层additionalProperties的直接产物。围绕该字段生成器提供了一组配套方法MapTest.javapublic MapTest mapMapOfString(MapString, MapString, String mapMapOfString) { this.mapMapOfString mapMapOfString; return this; } public MapTest putMapMapOfStringItem(String key, MapString, String mapMapOfStringItem) { if (this.mapMapOfString null) { this.mapMapOfString new HashMapString, MapString, String(); } this.mapMapOfString.put(key, mapMapOfStringItem); return this; } public MapString, MapString, String getMapMapOfString() { return mapMapOfString; } public void setMapMapOfString(MapString, MapString, String mapMapOfString) { this.mapMapOfString mapMapOfString; }这里有一个值得注意的设计细节putMapMapOfStringItem方法会在字段为null时自动初始化一个HashMap然后逐项放入元素并返回this。这种模式避免了客户端在使用前手动判空初始化让逐 key 构建 Map变得流畅安全。五、属性详解二mapOfEnumString——Map 与枚举的组合mapOfEnumString的类型为MapString, InnerEnum每个 value 都是一个枚举常量。它的方法配套MapTest.java与嵌套 Map 版本结构一致public MapTest mapOfEnumString(MapString, InnerEnum mapOfEnumString) { this.mapOfEnumString mapOfEnumString; return this; } public MapTest putMapOfEnumStringItem(String key, InnerEnum mapOfEnumStringItem) { if (this.mapOfEnumString null) { this.mapOfEnumString new HashMapString, InnerEnum(); } this.mapOfEnumString.put(key, mapOfEnumStringItem); return this; } public MapString, InnerEnum getMapOfEnumString() { return mapOfEnumString; } public void setMapOfEnumString(MapString, InnerEnum mapOfEnumString) { this.mapOfEnumString mapOfEnumString; }使用方式示例MapTest mt new MapTest() .putMapOfEnumStringItem(k1, InnerEnum.UPPER) .putMapOfEnumStringItem(k2, InnerEnum.LOWER);六、InnerEnum内嵌枚举及其 Gson 适配器MapTest.md 文档中用a nameMapString, InnerEnum/a锚点专门给出了内嵌枚举的取值表NameValueUPPERUPPERLOWERlower注意两个枚举常量大小写不一致UPPER全大写、lower全小写这正是为了验证枚举值与 Java 标识符脱钩时的映射能力。生成的枚举定义位于 MapTest.javaJsonAdapter(InnerEnum.Adapter.class) public enum InnerEnum { UPPER(UPPER), LOWER(lower); private String value; InnerEnum(String value) { this.value value; } public String getValue() { return value; } Override public String toString() { return String.valueOf(value); } public static InnerEnum fromValue(String text) { for (InnerEnum b : InnerEnum.values()) { if (String.valueOf(b.value).equals(text)) { return b; } } return null; } public static class Adapter extends TypeAdapterInnerEnum { Override public void write(final JsonWriter jsonWriter, final InnerEnum enumeration) throws IOException { jsonWriter.value(enumeration.getValue()); } Override public InnerEnum read(final JsonReader jsonReader) throws IOException { String value jsonReader.nextString(); return InnerEnum.fromValue(String.valueOf(value)); } } }这个枚举实现了完整的 Gson 序列化闭环JsonAdapter(InnerEnum.Adapter.class)注册自定义类型适配器替代默认的枚举序列化行为保证写出的 JSON 值是UPPER/lower字符串而非 Java 枚举名write()向JsonWriter写入enumeration.getValue()即原始 API 约定的字符串值read()读取 JSON 字符串后经fromValue反查枚举实例遇到未知值时返回null而非抛异常fromValue()遍历枚举常量逐一比对原始值提供从字符串到枚举的转换入口。七、对象协议equals / hashCode / toString生成器还为每个模型补齐了 Java 对象协议方法MapTest.javaOverride public boolean equals(java.lang.Object o) { if (this o) { return true; } if (o null || getClass() ! o.getClass()) { return false; } MapTest mapTest (MapTest) o; return Objects.equals(this.mapMapOfString, mapTest.mapMapOfString) Objects.equals(this.mapOfEnumString, mapTest.mapOfEnumString); } Override public int hashCode() { return Objects.hash(mapMapOfString, mapOfEnumString); } Override public String toString() { StringBuilder sb new StringBuilder(); sb.append(class MapTest {\n); sb.append( mapMapOfString: ).append(toIndentedString(mapMapOfString)).append(\n); sb.append( mapOfEnumString: ).append(toIndentedString(mapOfEnumString)).append(\n); sb.append(}); return sb.toString(); }equals使用Objects.equals逐字段比较天然支持null安全hashCode基于全部字段计算符合 equals/hashCode 约定toString通过私有方法toIndentedString将嵌套对象的换行统一缩进 4 个空格保证多层 Map 打印时可读。八、该模型的完整使用闭环综合以上各节MapTest的完整用法如下import io.swagger.client.model.MapTest; import io.swagger.client.model.MapTest.InnerEnum; import java.util.HashMap; import java.util.Map; // 1. 构建嵌套 Map外层 key - 内层 MapString, String MapTest test new MapTest(); MapString, String inner new HashMapString, String(); inner.put(pet, dog); test.putMapMapOfStringItem(category, inner); // 2. 构建枚举值 Map test.putMapOfEnumStringItem(status1, InnerEnum.UPPER); test.putMapOfEnumStringItem(status2, InnerEnum.LOWER); // 3. 读取 MapString, MapString, String m1 test.getMapMapOfString(); MapString, InnerEnum m2 test.getMapOfEnumString();当该模型作为请求体或响应体参与 API 调用时Gson 会依据SerializedName与JsonAdapter完成与 JSON 报文的双向转换。九、同类模型的横向参考MapTest并不是仓库中唯一的 Map 型模型它的生成逻辑与以下同类模型共享同一套模板规则可作为交叉验证的参考AdditionalPropertiesClass.md额外属性类演示additionalProperties基础用法EnumArrays.md数组与枚举的组合EnumTest.md标准枚举模型包含字符串、整数、浮点多种枚举类型对应源码均位于samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/目录。从源码结构可以推断swagger-codegen 的 Java 客户端模板位于 modules/swagger-codegen 模块下统一处理MapProperty并根据其additionalProperties是否为带枚举的StringProperty决定生成普通泛型 Map还是Map 枚举的组合形态而MapTest正是这些模板规则的端到端验证样本。总结通过MapTest这一个模型可以完整观察到 swagger-codegen 处理复杂 Map 类型的全链路OpenAPI 定义中的双层additionalProperties生成MapString, MapString, String带枚举的additionalProperties生成MapString, InnerEnum内嵌枚举被翻译为带JsonAdapter的 Java 枚举并配套链式 setter、putXxxItem增量构建、以及完整的equals/hashCode/toString实现。对于任何需要在 Java 客户端中承载嵌套 Map 或枚举值 Map 的 API这份生成样本都是可直接套用的实践范式。赞分享开发工具代码生成API设计【免费下载链接】swagger-codegenswagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.项目地址https://gitcode.com/gh_mirrors/sw/swagger-codegen点击查看免费下载相关推荐swagger-codegen 生成 Java 客户端中的 Map 模型以 google-api-client 样例 MapTest 为例swagger codegen 生成 Java 客户端中的 Map 模型以 google api client 样例 MapTest 为例 导读 MapTes开发工具代码生成API设计Swagger Codegen 生成的 User 模型详解以 Java Jersey1 Petstore 客户端为例Swagger Codegen 生成的 User 模型详解以 Java Jersey1 Petstore 客户端为例 导读 本文以 swagger codeg开发工具代码生成API设计swagger-codegen 生成 Java 客户端 Map 模型实战以 MapTest 为例解析 OpenAPI 嵌套 Map 与枚举 Map 的落地方式swagger codegen 生成 Java 客户端 Map 模型实战以 MapTest 为例解析 OpenAPI 嵌套 Map 与枚举 Map 的落地方式开发工具代码生成API设计上一篇从电视盒子到全能服务器Amlogic S9xxx设备Armbian改造终极指南下一篇61亿参数撬动400亿性能蚂蚁开源Ring-flash-2.0改写大模型性价比规则创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/10/6 15:16:42

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/10/4 15:02:13

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/10/6 15:18:24

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/10/6 16:48:59

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/10/4 14:31:34

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/10/6 16:58:56

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉