十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

swagger-codegen 生成的 Java 模型 EnumArrays 详解:单值枚举与数组枚举字段的 OpenAPI 到客户端映射

swagger-codegen 生成的 Java 模型 EnumArrays 详解:单值枚举与数组枚举字段的 OpenAPI 到客户端映射 swagger-codegen 生成的 Java 模型 EnumArrays 详解单值枚举与数组枚举字段的 OpenAPI 到客户端映射【免费下载链接】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导读EnumArrays是 swagger-codegen 在 Javagoogle-api-client客户端示例中生成的一个典型模型类用于演示 OpenAPI/Swagger 定义中「普通字符串枚举字段」与「字符串枚举数组字段」两种场景在客户端模型中的落地方式。本文以 EnumArrays.md 为骨架结合生成源码 EnumArrays.java 与 OpenAPI 定义 petstorefake.yaml第 1423-1447 行完整讲解该模型的属性结构、枚举类型设计、JSON 序列化/反序列化原理以及EnumArrays中带特殊字符、$的枚举值如何被安全映射为 Java 常量。读完本文你将掌握 swagger-codegen 生成枚举型模型的核心模式并能在自己的 Java 客户端中正确使用这类生成的枚举。模型概览EnumArrays 的字段结构EnumArrays模型包含两个字段均来自 petstore 测试规格petstorefake.yaml中的定义字段名JSON 名Java 属性类型说明just_symboljustSymbolJustSymbolEnum枚举单值枚举字符串可选optionalarray_enumarrayEnumListArrayEnumEnum枚举列表枚举字符串数组可选optional在 OpenAPI 2.0 定义中该模型声明如下EnumArrays: type: object properties: just_symbol: type: string enum: - - $ array_enum: type: array items: type: string enum: - fish - crab这段定义来自 fixtures/immutable/specifications/v2/petstorefake.yaml。它同时覆盖了两种常见的枚举形态标量枚举just_symbol是普通string类型通过顶层enum限定可选值数组枚举array_enum是array类型其items上声明enum表示「列表中的每个元素都必须是枚举值之一」。值得注意的是该定义末尾有一段被注释掉的array_array_enum二维数组枚举array的元素仍是array最内层才是enum注释明确说明「2d array of enum is not supported at the moment」即当前版本的 swagger-codegen 尚不支持枚举的二维数组。这段注释也从侧面说明了EnumArrays存在的意义作为专门测试「枚举 数组」组合场景的 fixture 模型。枚举字段设计从 YAML 枚举到 Java 枚举类swagger-codegen 为每个枚举字段生成一个内嵌的 Javaenum类型而不是把枚举值硬编码为字符串常量。这样做的收益是类型安全编译期即可拦截非法赋值序列化时也能保证输出值一定属于枚举集合。JustSymbolEnum特殊字符枚举值的常量命名justSymbol字段对应的枚举定义如下摘自 EnumArrays.javapublic enum JustSymbolEnum { GREATER_THAN_OR_EQUAL_TO(), DOLLAR($); private String value; JustSymbolEnum(String value) { this.value value; } JsonValue public String getValue() { return value; } Override public String toString() { return String.valueOf(value); } JsonCreator public static JustSymbolEnum fromValue(String value) { for (JustSymbolEnum b : JustSymbolEnum.values()) { if (b.value.equals(value)) { return b; } } return null; } }这里有三个关键设计点值得展开说明常量名与 JSON 值分离JSON 侧的枚举值分别是和$——它们包含运算符、货币符号等不能直接作为 Java 标识符的字符。swagger-codegen 采用「语义化大写蛇形命名」将其映射为合法的 Java 常量名→GREATER_THAN_OR_EQUAL_TO$→DOLLAR。这种命名方式见 EnumArrays.md 中的 Name/Value 对照表既保证了 Java 语法合法性又让常量名可读、可推断。JsonValue控制序列化输出标注在getValue()上后Jackson 序列化该枚举时输出的是构造时存入的原始字符串值如而不是 Java 常量名从而保证与 OpenAPI 定义中的枚举值严格一致。JsonCreatorfromValue控制反序列化从 JSON 读取字符串时遍历所有枚举常量用value.equals(value)匹配原始值匹配不到时返回null而不是抛异常对应文档中该字段「optional」的语义。ArrayEnumEnum数组元素枚举arrayEnum列表的元素类型ArrayEnumEnum采用同样的模式EnumArrays.javapublic enum ArrayEnumEnum { FISH(fish), CRAB(crab); // ... 与 JustSymbolEnum 相同的 value 字段、JsonValue、fromValue }从生成结果看标量枚举与数组元素枚举在枚举类型本身的生成逻辑上是完全一致的区别只在于字段声明处一个是JustSymbolEnum单值一个是ListArrayEnumEnum。这印证了 swagger-codegen 对「enum in items」的展开方式——它不会生成一个「枚举数组」的专用类型而是生成元素枚举类型 标准的java.util.List容器。字段属性与 Jackson 注解映射模型类对两个字段的声明如下EnumArrays.javaJsonProperty(just_symbol) private JustSymbolEnum justSymbol null; JsonProperty(array_enum) private ListArrayEnumEnum arrayEnum null;要点JSON 名采用蛇形snake_caseYAML 属性名just_symbol、array_enum原样保留为JsonProperty值而 Java 属性名被转换为驼峰camelCasejustSymbol、arrayEnum。这正是 google-api-client 默认 Java 命名策略的体现字段默认初始化为null与文档中「optional」标注一致。ApiModelProperty(value )属性上的 Swagger 注解来自io.swagger.annotations生成时未带描述信息原 YAML 未写 description因此文档中 Description 列为空。数组字段的流畅构建方法对于List类型字段swagger-codegen 额外生成了addArrayEnumItem(...)辅助方法EnumArrays.java内部采用懒初始化if (this.arrayEnum null) { this.arrayEnum new ArrayList(); }后追加元素方便以链式/流式方式构建模型。序列化与反序列化Jackson Google HTTP Client 的协作EnumArrays所在的 google-api-client 客户端模块其底层 JSON 处理由 Jackson 完成。在 ApiClient.java 中可以看到该模块的核心依赖import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule; import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.Json;ApiClient内部持有一个默认配置好的ObjectMapper客户端也可传入自定义ObjectMapper源码注释说明默认 mapper 只是「reasonable defaults」。实际 HTTP 层则交由 Google API Client 的HttpTransport、HttpRequestFactory处理。因此EnumArrays的完整 JSON 往返链路是序列化写Jackson 调用JsonValue注解的getValue()把JustSymbolEnum.GREATER_THAN_OR_EQUAL_TO输出为 JSON 字符串传输由 Google HTTP Client 以application/jsonJson.MEDIA_TYPE发送反序列化读Jackson 调用JsonCreator注解的静态工厂fromValue(...)把收到的还原为对应的枚举常量。这套「JsonValueJsonCreator」双注解模式是 swagger-codegen 生成枚举型 Java 模型的标准做法可保证枚举的字符串值在 JSON 与 Java 对象之间无损往返。客户端使用示例基于生成的源码客户端可以这样使用EnumArraysEnumArrays model new EnumArrays() .justSymbol(EnumArrays.JustSymbolEnum.GREATER_THAN_OR_EQUAL_TO) .addArrayEnumItem(EnumArrays.ArrayEnumEnum.FISH) .addArrayEnumItem(EnumArrays.ArrayEnumEnum.CRAB); // 读取枚举值 EnumArrays.JustSymbolEnum symbol model.getJustSymbol(); ListEnumArrays.ArrayEnumEnum enums model.getArrayEnum(); // 序列化结果: {just_symbol:,array_enum:[fish,crab]}由于枚举常量都声明在模型类内部使用时以EnumArrays.JustSymbolEnum.GREATER_THAN_OR_EQUAL_TO的形式引用IDE 补全即可列出全部合法值无需记忆原始字符串。需要说明的是EnumArrays属于 petstore 测试规格中的非 API 关联模型FakeApi 等接口测试用模型在samples/client/petstore/java/google-api-client目录下未发现针对它的独立单元测试其验证主要依赖 petstorefake 规格的整体代码生成流程。小结EnumArrays虽然只是一个测试模型却完整演示了 swagger-codegen 处理「枚举」与「枚举数组」两大场景的成熟模式OpenAPI 中enum字段会被展开为内嵌 Java 枚举类JSON 字符串值与 Java 常量名解耦特殊字符值、$也能安全映射数组字段的枚举体现在items上生成结果为List元素枚举并配套add...Item便捷方法借助JsonValue/JsonCreator与 Jackson 的协作枚举值在 JSON 与 Java 对象间往返无损原 YAML 中被注释的array_array_enum表明二维枚举数组当时尚不受支持这是使用该能力前需要确认的版本限制。如果你正在使用 swagger-codegen 生成包含枚举字段的 Java 客户端可以参考 EnumArrays.md 这类模型文档快速核对字段与枚举值再对照生成的 EnumArrays.java 理解底层映射细节其他模型的枚举设计如 EnumClass.md、EnumTest.md也遵循完全相同的模式可以互相印证。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表