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

资讯详情

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

swagger-codegen 模型文档解析:以 jersey1 生成的 ReadOnlyFirst 为例读懂只读属性约定

swagger-codegen 模型文档解析:以 jersey1 生成的 ReadOnlyFirst 为例读懂只读属性约定 开发工具代码生成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 Jersey1 客户端样例中生成的模型文档 ReadOnlyFirst.md 为主体讲解 OpenAPI/Swagger 定义中的readOnly属性如何被模板引擎翻译成模型 API 文档、Java POJO 与注释约定。读完本文你将能看懂任意一个由 swagger-codegen 生成的docs/*.md模型文档的结构并理解只读属性在客户端代码中的落地形态。文档来源一份典型的生成式模型文档ReadOnlyFirst.md是 swagger-codegen 对 petstore 测试定义fixtures/immutable/specifications/v2/petstorefake.yaml中ReadOnlyFirst模型执行代码生成后自动产出的文档文件位于 samples/client/petstore/java/jersey1/docs/ 目录。它不属于手写文档而是由 Java 生成器模板 Java/pojo_doc.mustache 渲染得到。原文档正文如下# ReadOnlyFirst ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **bar** | **String** | | [optional] **baz** | **String** | | [optional]虽然篇幅简短但它承载了完整的信息结构模型名、属性表头Name / Type / Description / Notes以及每个属性在 Notes 列中通过[optional]标注的可选性信息。后续内容将逐层拆解这份文档背后的生成原理与代码落地。模型文档的生成模板与渲染逻辑所有 Java 客户端含 jersey1的模型文档都由模板 modules/swagger-codegen/src/main/resources/Java/pojo_doc.mustache 渲染。模板核心逻辑如下# {{classname}} ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- {{#vars}}**{{name}}** | {{#isEnum}}...{{/isEnum}}{{^isEnum}}{{#isPrimitiveType}}**{{datatype}}**{{/isPrimitiveType}}{{^isPrimitiveType}}**{{datatype}}**{{/isPrimitiveType}}{{/isEnum}} | {{description}} | {{^required}} [optional]{{/required}}{{#readOnly}} [readonly]{{/readOnly}} {{/vars}}从中可以提炼出三条渲染规则名称与类型列属性名加粗输出如果属性是基本类型如String、Integer直接打印类型名如果是复杂类型其他模型、容器则输出指向对应模型文档的 Markdown 链接例如[ReadOnlyFirst](https://link.gitcode.com/i/41d411206e5ea18f18137d0866b1e8ad)。Description 列直接输出 OpenAPI 定义中description字段的值ReadOnlyFirst的bar、baz均未填写 description因此该列为空。Notes 列required为假时追加[optional]readOnly为真时追加[readonly]。ReadOnlyFirst.bar与baz均非必填因此都只有[optional]。注意ReadOnlyFirst.bar在 YAML 定义中标记了readOnly: true但其 Java 客户端模型文档却未出现[readonly]标注。原因在于该示例对应的 Java 生成器模板如 Java/pojo_doc.mustache版本中并未将{{#readOnly}}分支渲染进最终的模型文档表相比之下csharp/model_doc.mustache、go/model_doc.mustache 等语言模板则会在 Notes 列输出[readonly]。因此阅读ReadOnlyFirst.md时只读信息需要结合生成后的 Java 源码ReadOnlyFirst.java或原始 YAML 定义确认。从 OpenAPI 定义到文档ReadOnlyFirst 的源头ReadOnlyFirst模型定义位于 fixtures/immutable/specifications/v2/petstorefake.yaml第 1313–1320 行ReadOnlyFirst: type: object properties: bar: type: string readOnly: true baz: type: stringbartype: string且readOnly: true语义上表示该字段由服务端生成/维护客户端不应提交。baz普通type: string未标记只读也未在required列表中因此是可选的读写字段。同一 YAML 中还定义了对照模型hasOnlyReadOnly第 1321–1329 行其两个属性bar、foo全部为readOnly: true用于专门测试仅含只读字段的模型生成。该模型生成的 Java 类 HasOnlyReadOnly.java 与ReadOnlyFirst的关键差异是两个属性都只有 getter没有任何 setter。只读属性在生成代码中的落地getter 与 setter 的取舍对比两份生成的 Java 源码可以直观看到readOnly对代码生成的实际影响这是模型文档 Notes 列所不体现的细节属性定义中的标记ReadOnlyFirst.java 行为HasOnlyReadOnly.java 行为barreadOnly: true仅 getter无 setter仅 getter无 setterbaz普通字段getter setter 链式方法——fooreadOnly: true——仅 getter无 setter具体到 ReadOnlyFirst.java字段声明统一使用JsonProperty(bar)/JsonProperty(baz)绑定 JSON 属性名bar只有getBar()没有setBar()也没有 builder 风格的链式赋值方法——这是readOnly: true的直接产物baz则具备完整的 getter、setter 以及返回this的链式方法baz(String baz)方便流式构造对象。因此只读字段在客户端模型中的含义是反序列化时服务端返回的bar可以被读取但客户端不能通过 setter 主动设置该字段。这从结构上防止了客户端向只读字段写入与协议不符的数据。只读属性的组合使用ArrayTest 与泛型容器ReadOnlyFirst不仅在独立模型中作为属性出现也被其他模型复用。例如 ArrayTest.java 中声明了private ListListReadOnlyFirst arrayArrayOfModel提供addArrayArrayOfModelItem(...)、getArrayArrayOfModel()、setArrayArrayOfModel(...)等访问方法。此时ReadOnlyFirst以复杂类型身份出现在其他模型的文档 Notes 列链接中[**ReadOnlyFirst**](https://link.gitcode.com/i/41d411206e5ea18f18137d0866b1e8ad)形成模型文档之间的交叉引用。这也解释了模板中{{^isPrimitiveType}}分支存在的意义非基本类型一律输出指向对应.md的链接保证生成的文档集合互相可达、可以整体作为 API 客户端手册使用。只读字段的语义边界与阅读提示从 fixtures/immutable/specifications/v2/petstorefake.yaml 中还可以找到更多readOnly: true的使用点如Name模型的snake_case、123Number属性说明该标记在测试规格中覆盖了多种命名与类型场景用于验证生成器对不同形态只读字段的处理一致性。在阅读ReadOnlyFirst.md这类生成文档时建议遵循以下要点[optional]仅代表不在required列表中与是否只读无关bar同时具备 optional 与 readOnly 两种语义。Notes 列是否显示[readonly]取决于具体语言的生成模板Java jersey1 样例未渲染该标注应以生成源码的 getter/setter 结构为准。想要确认某个属性的读写能力最可靠的方式是查看对应 src/main/java/io/swagger/client/model/ 下的 POJO有 setter 即可写只有 getter 即只读。模型文档之间通过类型名链接相互引用可作为客户端 SDK 的目录索引使用。相关资源模型文档samples/client/petstore/java/jersey1/docs/ReadOnlyFirst.md生成源码ReadOnlyFirst.java、HasOnlyReadOnly.java、ArrayTest.java生成模板modules/swagger-codegen/src/main/resources/Java/pojo_doc.mustache规格定义fixtures/immutable/specifications/v2/petstorefake.yamlReadOnlyFirst见第 1313–1320 行hasOnlyReadOnly见第 1321–1329 行赞分享开发工具代码生成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 生成的 C 只读属性模型详解以 Petstore 的 ReadOnlyFirst 为例swagger codegen 生成的 C 只读属性模型详解以 Petstore 的 ReadOnlyFirst 为例 导读 ReadOnlyFirst 是开发工具代码生成API设计swagger-codegen 只读模型属性解析以 C NetStandard 客户端 ReadOnlyFirst 为例swagger codegen 只读模型属性解析以 C NetStandard 客户端 ReadOnlyFirst 为例 导读 在 OpenAPI/Swagg开发工具代码生成API设计swagger-codegen 只读属性readOnly深度解析以 HasOnlyReadOnly 模型文档与 Java/jersey1 生成样例为切入点swagger codegen 只读属性readOnly深度解析以 HasOnlyReadOnly 模型文档与 Java/jersey1 生成样例为切入点开发工具代码生成API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表