尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

swagger-codegen 模型文档解析:从 ArrayOfNumberOnly 看懂“纯数字数组“模型的定义、生成与使用

swagger-codegen 模型文档解析:从 ArrayOfNumberOnly 看懂“纯数字数组“模型的定义、生成与使用 开发工具代码生成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点击查看免费下载导读ArrayOfNumberOnly是 swagger-codegen 项目中用于测试数字数组序列化的典型模型本文以 samples/client/petstore/java/jersey1/docs/ArrayOfNumberOnly.md 这份自动生成的模型参考文档为线索完整还原该模型从 OpenAPI/Swagger 定义、Java 代码生成、BigDecimal 类型映射到最终文档产物的全链路。读完本文你将掌握如何阅读 swagger-codegen 生成的模型文档、理解[optional]标记的来源并能独立在 Jersey1 Java 客户端中构造与使用该模型。一、文档本身一份精炼的模型属性参考ArrayOfNumberOnly.md是 swagger-codegen 为 Jersey1Java客户端生成的模型文档全文聚焦于一个数据模型核心内容如下NameTypeDescriptionNotesarrayNumberListBigDecimal[optional]这份表格传达了三层关键信息属性名arrayNumberJava 侧驼峰命名属性类型元素为BigDecimal的List即纯数字数组可空性标记为[optional]即该属性不是必填项请求/响应中可以缺省。可以看到整个模型只包含一个属性这正是它被命名为Array Of Number Only仅含数字数组的原因——它被专门设计用来验证对象中只有数组字段这一边界场景的代码生成与序列化行为。二、模型源头Swagger 定义文件中的 ArrayOfNumberOnly该模型并非凭空产生而是来自仓库中的测试规格specification。在 fixtures/immutable/specifications/v2/petstorefake.yaml 中其定义如下ArrayOfNumberOnly: type: object properties: ArrayNumber: type: array items: type: number对应地OpenAPI 3.0 版本的规格文件 fixtures/immutable/specifications/v3/petstore3fake.yaml 中除了相同的结构外还额外提供了示例值ArrayOfNumberOnly: type: object properties: ArrayNumber: type: array items: type: number example: id: 0 ArrayNumber: - 0 - 1 - 2 - 3 - 4 - 5 - 6定义与文档的映射关系值得注意YAML 中的属性名是ArrayNumber大写开头而生成的 Java 文档中变成了arrayNumber小驼峰——swagger-codegen 的 Java 语言生成器会执行标准的驼峰命名转换YAML 中的items: { type: number }被映射为 Java 的ListBigDecimal详见下文类型映射一节由于properties中的属性默认非必填文档中才会出现[optional]标记。除 petstore 系列外该模型还被用作生成器自身的测试夹具例如 modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml用于验证代码生成器在解析数组模型时的正确性。三、生成的 Jersey1 Java 模型类剖析基于上述 Swagger 定义swagger-codegen 生成了对应的 POJOsamples/client/petstore/java/jersey1/src/main/java/io/swagger/client/model/ArrayOfNumberOnly.java。核心代码结构如下public class ArrayOfNumberOnly { JsonProperty(ArrayNumber) private ListBigDecimal arrayNumber null; public ArrayOfNumberOnly arrayNumber(ListBigDecimal arrayNumber) { this.arrayNumber arrayNumber; return this; } public ArrayOfNumberOnly addArrayNumberItem(BigDecimal arrayNumberItem) { if (this.arrayNumber null) { this.arrayNumber new ArrayListBigDecimal(); } this.arrayNumber.add(arrayNumberItem); return this; } ApiModelProperty(value ) public ListBigDecimal getArrayNumber() { return arrayNumber; } public void setArrayNumber(ListBigDecimal arrayNumber) { this.arrayNumber arrayNumber; } }几个值得展开的实现细节JsonProperty(ArrayNumber)注解生成的字段名是arrayNumber但 JSON 序列化/反序列化时使用的键名仍然是 Swagger 定义中的原始名称ArrayNumber。这意味着服务端与客户端之间的 wire format 不受 Java 命名规范影响保持了与规格文件的一致。链式fluentsetterarrayNumber(ListBigDecimal)返回this支持连续调用便于在测试或构造请求体时写出紧凑代码。addArrayNumberItem便捷方法当从零开始逐条追加元素时该方法自动处理null初始化懒加载ArrayList避免调用方手动判空。样板方法类中同时生成了equals、hashCode基于Objects.equals/Objects.hash仅以arrayNumber为判定依据以及带缩进格式的toString保证模型可作为值对象在集合与日志场景中安全使用。四、BigDecimal 类型映射与精度控制文档中ListBigDecimal的类型选择并非偶然。swagger-codegen 的 Java 生成器在 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java 中对BigDecimal有专门的精度处理逻辑if(serializeBigDecimalAsString) { if (property.baseType.equals(BigDecimal)) { // we serialize BigDecimal as string to avoid precision loss property.vendorExtensions.put(extraAnnotation, JsonSerialize(using ToStringSerializer.class)); model.imports.add(ToStringSerializer); model.imports.add(JsonSerialize); } }从源码注释可以确认默认情况下 Swagger 定义的type: number在 Java 端映射为BigDecimal而非Double或Float以避免浮点数精度损失而生成器还暴露了serializeBigDecimalAsString配置项开启后会将BigDecimal以字符串形式序列化通过ToStringSerializer进一步规避 JSON 数字在跨语言传输时的精度风险。此外AbstractJavaCodegen.java 中还将BigDecimal纳入数字字面量处理范围在生成默认值时会使用new BigDecimal(...)构造保证模型默认值的精度。五、模型文档是如何生成的pojo_doc.mustache 模板ArrayOfNumberOnly.md这样的文档并非手写而是由 Mustache 模板在代码生成阶段一并产出。生成 Java 模型文档的模板位于 modules/swagger-codegen/src/main/resources/Java/pojo_doc.mustache其属性表核心片段为**{{name}}** | ... | {{description}} | {{^required}} [optional]{{/required}}{{#readOnly}} [readonly]{{/readOnly}}据此可以得出两点结论[optional]标记由{{^required}}逻辑块渲染——只有当属性在 Swagger 定义中非必填时才输出。ArrayOfNumberOnly的ArrayNumber位于properties下、且未出现在required列表中因此文档中标记为[optional]。[readonly]标记由{{#readOnly}}渲染用于标识只读属性swagger-codegen 中为readOnly: true的字段。本文模型不含只读字段故未出现。同理API 文档如FakeApi.md的生成模板 api_doc.mustache 使用相同标记逻辑。理解这些模板就能读懂任何由 swagger-codegen 生成的.md文档中每一列标记的确切含义。六、实战构造与使用该模型结合上面的分析在 Jersey1 客户端中构造ArrayOfNumberOnly有两种典型方式方式一一次性传入整个列表import io.swagger.client.model.ArrayOfNumberOnly; import java.math.BigDecimal; import java.util.Arrays; ArrayOfNumberOnly model new ArrayOfNumberOnly() .arrayNumber(Arrays.asList( new BigDecimal(1.5), new BigDecimal(2.25), new BigDecimal(3.75) ));方式二逐条追加元素自动懒初始化ArrayOfNumberOnly model new ArrayOfNumberOnly() .addArrayNumberItem(new BigDecimal(10.01)) .addArrayNumberItem(new BigDecimal(20.02));序列化后的 JSON 将遵循JsonProperty(ArrayNumber)指定的键名形如{ ArrayNumber: [10.01, 20.02] }由于所有字段均为[optional]即便不设置arrayNumber也能正常构造模型字段保持null序列化时默认省略或输出null取决于 Jackson 配置这正是仅含数字数组模型的自由度所在。七、模型家族与 NumberOnly、ArrayOfArrayOfNumberOnly 的对比ArrayOfNumberOnly并非孤立存在它与 petstore 测试套件中的两个姊妹模型共同覆盖数字类型的容器边界场景模型文档生成类Swagger 定义要点NumberOnlyNumberOnly.mdio.swagger.client.model.NumberOnlyJustNumber: { type: number }单个数字属性ArrayOfNumberOnlyArrayOfNumberOnly.mdio.swagger.client.model.ArrayOfNumberOnlyArrayNumber: { type: array, items: { type: number } }数字数组ArrayOfArrayOfNumberOnlyArrayOfArrayOfNumberOnly.mdio.swagger.client.model.ArrayOfArrayOfNumberOnlyArrayArrayNumber元素为数字数组的嵌套数组ListListBigDecimal三者共同验证了 swagger-codegen 对数字 → BigDecimal一维数组 →ListBigDecimal二维数组 →ListListBigDecimal的递归类型映射能力。以 ArrayOfArrayOfNumberOnly.java 为例其字段声明为ListListBigDecimal并同样生成了addArrayArrayNumberItem(ListBigDecimal ...)便捷方法——与ArrayOfNumberOnly的生成模式完全同构可以印证生成器在容器类型上的处理逻辑是一致的。八、小结ArrayOfNumberOnly虽然只是 petstore 测试规格中的一个边界用例模型但它完整串联起了 swagger-codegen 的核心能力链路规格驱动模型源自 petstorefake.yaml 等 Swagger/OpenAPI 定义命名转换与类型映射ArrayNumber→arrayNumbertype: number→BigDecimal代码生成产出带 Jackson 注解、fluent API 与便捷方法的 POJO 类文档生成由 pojo_doc.mustache 模板渲染出带有[optional]/[readonly]语义标记的属性参考表。读懂这一份小小的模型文档就等于掌握了阅读整个 swagger-codegen 生成物模型、API 文档、客户端代码的通用方法。如需查看该模型在完整客户端中的位置可参见 samples/client/petstore/java/jersey1/README.md 中的模型索引。赞分享开发工具代码生成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点击查看免费下载相关推荐从 OpenAPI 定义到 Go 模型文档Swagger Codegen 中 ArrayOfNumberOnly 的生成原理与使用指南从 OpenAPI 定义到 Go 模型文档Swagger Codegen 中 ArrayOfNumberOnly 的生成原理与使用指南 导读 ArrayOfN开发工具代码生成API设计swagger-codegen 生成的 C 模型文档详解以 Model200Response 为例看懂模型文档生成链路swagger codegen 生成的 C 模型文档详解以 Model200Response 为例看懂模型文档生成链路 导读 Model200Response开发工具代码生成API设计swagger-codegen Go 客户端模型解析从 OpenAPI 定义到 ArrayOfNumberOnly 的生成与序列化swagger codegen Go 客户端模型解析从 OpenAPI 定义到 ArrayOfNumberOnly 的生成与序列化 ArrayOfNumber开发工具代码生成API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表