swagger-codegen 只读属性(readOnly)深度解析:以 HasOnlyReadOnly 模型文档与 Java/jersey1 生成样例为切入点
开发工具代码生成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 仓库中由代码生成器自动产出的模型文档samples/client/petstore/java/jersey1/docs/HasOnlyReadOnly.md展开剖析该文档所代表的HasOnlyReadOnly模型在 OpenAPI/Swagger 规格中的定义、在生成的 Java 客户端代码中的形态以及readOnly: true这一属性修饰符从规格解析到模板渲染的完整链路。读完本文你将掌握 swagger-codegen 处理只读属性的底层机制能够在自己的项目中正确使用readOnly修饰符并理解生成代码与生成文档之间的对应关系。1. HasOnlyReadOnly 文档是什么一份自动生成的模型参考文档HasOnlyReadOnly.md位于 petstore Java 客户端jersey1 库样例的文档目录中属于 swagger-codegen 在生成客户端代码时同时生成的模型级参考文档。其内容是一张属性表完整信息如下名称类型说明NotesbarString[optional]fooString[optional]这份文档不是手写的而是由生成器模板引擎Mustache驱动产出任何 OpenAPI/Swagger 定义中的 schema在生成 Java 客户端时都会对应生成一份形如ModelName.md的文档。生成该文档的模板位于 pojo_doc.mustache其核心结构如下# {{classname}} ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- {{#vars}}**{{name}}** | ... | {{description}} | {{^required}} [optional]{{/required}}{{#readOnly}} [readonly]{{/readOnly}} {{/vars}}从模板可以看到 Notes 列的两个标记规则非必填属性required为空渲染[optional]只读属性readOnly: true渲染[readonly]。HasOnlyReadOnly的两个属性均未声明required因此 Notes 列为[optional]。值得注意的细节是当前版本模板在只读时会额外追加[readonly]标记而仓库中已提交的这份样例文档只含有[optional]可以推断该样例是由较早版本的模板生成的——若用当前代码重新生成Notes 列将变为[optional] [readonly]的形式。这也提示读者仓库samples/目录下的产物与最新模板之间存在版本差分析时应以模板与源码为准。2. 规格源头readOnly: true 的两种写法v2 / v3HasOnlyReadOnly是 petstore 测试规格petstore fake中专门用于验证只读属性处理逻辑的模型。该模型在仓库的多个规格 fixture 中均有定义且跨越 OpenAPI v2 与 v3 两种格式。OpenAPI v2Swagger 2.0定义在 petstorefake.yaml 的definitions区约第 1321 行起hasOnlyReadOnly: type: object properties: bar: type: string readOnly: true foo: type: string readOnly: truev2 中同样存在ReadOnlyFirst模型约第 1313 行起它只将bar标记为readOnly: true、baz为普通属性与hasOnlyReadOnly两个属性全部只读形成对照测试组合。OpenAPI v3 定义在 v3 规格 petstore3fake.yaml约第 1885 行起与 petstoreMixed3.yaml约第 2159 行起中模型定义位于components/schemas之下hasOnlyReadOnly: type: object properties: bar: type: string readOnly: true foo: type: string readOnly: true可以看到除容器关键字不同v2 为definitionsv3 为components/schemas外属性定义完全一致两个String类型属性bar、foo均被标记为readOnly: true且都未声明required。这正是该模型名称的由来——HasOnlyReadOnly即只有只读属性的模型其存在意义就是专门验证当模型所有属性都是只读时生成器各语言模板能否正确产出对应的 getter、省略 setter并保持文档一致。3. 生成的 Java 模型只读属性为何只有 getter、没有 setter生成的 Java 模型类位于 HasOnlyReadOnly.java。打开该类可以观察到两个关键特征特征一两个属性均以JsonProperty注解声明但没有对应的 setter。public class HasOnlyReadOnly { JsonProperty(bar) private String bar null; JsonProperty(foo) private String foo null; /** * Get bar * return bar **/ ApiModelProperty(value ) public String getBar() { return bar; } /** * Get foo * return foo **/ ApiModelProperty(value ) public String getFoo() { return foo; } // 注意没有 setBar / setFoo 方法 }特征二类中只生成了 getter、equals、hashCode、toString等通用方法。这一行为的实现依据在 Java 语言模板 pojo.mustache 中setter 的渲染被{{^isReadOnly}}条件块包裹即仅当属性非只读时才生成 setter/** * Get {{name}} * return {{name}} **/ ApiModelProperty(...) public {{{datatypeWithEnum}}} {{#isBoolean}}is{{/isBoolean}}{{getter}}() { return {{name}}; } {{^isReadOnly}} public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { this.{{name}} {{name}}; } {{/isReadOnly}}语义很明确只读属性表示该字段由服务端生成或维护客户端只读不写。因此生成器为bar、foo各生成一个 getter而跳过 setter。这一点在序列化层面也保持一致Jackson 反序列化时若 JSON 响应中包含bar/foo字段仍可通过 getter 对应的字段注入读取但客户端代码在编译期就没有写入口从 API 设计上杜绝了对只读字段的误写。值得一提的是jersey1 与 jersey3 等各 Java 子库的 pojo 模板在这部分逻辑上保持一致jersey3 的 pojo.mustache 中 setter 同样受只读条件约束说明只读属性不生成 setter是 Java 生成器各 library 共同遵守的约定。4. 生成器底层isReadOnly 标志从 OpenAPI 属性到 CodegenProperty 的传递文档与代码中的只读行为最终都归结于 swagger-codegen 内部中间模型CodegenProperty的一个布尔字段。在 CodegenProperty.java 中public boolean isReadOnly false;该字段默认值为false。OpenAPI 定义中的readOnly修饰符在代码生成阶段被解析并映射到这个字段映射逻辑位于 DefaultCodegen.java约第 1723 行if (p.getReadOnly() ! null) { property.isReadOnly p.getReadOnly(); }即当规格中该属性显式声明了readOnly时就把其布尔值原样赋给CodegenProperty.isReadOnly。此后所有语言模板都可以通过{{#isReadOnly}}/{{^isReadOnly}}访问这一标志从而决定渲染策略文档模板pojo_doc.mustache依据它输出[readonly]标记Java 模型模板pojo.mustache依据它省略 setter同时equals/hashCodeCodegenProperty.java 第 103、249 行附近也将该标志纳入比较与哈希计算保证中间模型的一致性判断正确。从源码结构还可以推断isReadOnly是模板可见的公开字段各语言生成器Java、Python、Go、Swift 等都能基于它实现各自的只读语义如某些语言生成只读注解、其他语言完全省略写入方法这构成了 swagger-codegen 一处解析、处处可用的模板驱动机制的核心环节。5. 实战验证如何重新生成并核对这份文档仓库中samples/client/petstore/java/jersey1/是一份完整的生成产物目录包含源码、文档与构建文件其 README.md 说明了作为独立 Maven 工程使用与发布的方式。要自行验证只读属性 → 无 setter 文档 Notes 标记的完整链路可按照以下思路操作确认生成器可用swagger-codegen 提供命令行入口模块 swagger-codegen-cli读者可按 docs/generators.md 中介绍的方式构建并获取 CLI 可执行包mvn package后使用target下的 CLI jar或直接使用 Docker 镜像方式运行参见 Dockerfile 与 docs/docker.md。选择生成器与库本文对应的样例使用 Java 生成器-l java并指定--library jersey1子库规格文件可使用 petstorefake.yamlv2或 petstore3fake.yamlv3二者均包含hasOnlyReadOnly模型定义。核对产出生成后检查两处——源码目录下HasOnlyReadOnly.java应只有getBar()/getFoo()不应出现setBar()/setFoo()文档目录下HasOnlyReadOnly.md属性表应包含bar、foo两行Notes 列在当前模板下会同时出现[optional] [readonly]与仓库中旧版样例略有差异属模板版本演进所致。对照参照组可同时观察ReadOnlyFirstv2 规格中bar只读、baz普通的生成结果比较部分只读与全部只读两种模型在 getter/setter 数量上的差别从而加深对{{^isReadOnly}}条件渲染的理解。6. 小结通过HasOnlyReadOnly.md这一看似只有两行属性表的文档可以还原出 swagger-codegen 处理只读属性的完整技术链路规格层readOnly: true在 v2/v3 规格中写法一致仅容器位置不同definitions/components/schemas解析层DefaultCodegen将规格的readOnly值映射到CodegenProperty.isReadOnlyDefaultCodegen.java模板层pojo.mustache用{{^isReadOnly}}控制 setter 的生成pojo_doc.mustache用{{#readOnly}}控制文档 Notes 列的输出产物层生成的 Java 类HasOnlyReadOnly.java只含 getter、不含 setter与文档表述完全对应。对于在自己的 OpenAPI 定义中使用readOnly: true的开发者核心结论是该修饰符会让生成客户端只读该字段、禁止写入适合服务端生成 ID、时间戳、状态等不应由客户端修改的字段而对于 swagger-codegen 的二次开发者isReadOnly标志则是扩展自定义模板时实现只读语义的标准入口。赞分享开发工具代码生成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 只读属性模型以 HasOnlyReadOnly 为例解读 readOnly 语义的实现swagger codegen 生成 C 只读属性模型以 HasOnlyReadOnly 为例解读 readOnly 语义的实现 导读 本文以 swagger开发工具代码生成API设计Swagger Codegen C 客户端模型文档解析以 HasOnlyReadOnly 为例理解 readOnly 属性的生成与使用Swagger Codegen C 客户端模型文档解析以 HasOnlyReadOnly 为例理解 readOnly 属性的生成与使用 导读 本文以 swag开发工具代码生成API设计深入解析 swagger-codegen 如何生成 HasOnlyReadOnly 只读模型从 OpenAPI readOnly 属性到 C 私有 Setter深入解析 swagger codegen 如何生成 HasOnlyReadOnly 只读模型从 OpenAPI readOnly 属性到 C 私有 Sette开发工具代码生成API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Yii 2.0 从 1.1 版本升级指南:核心差异、重构要点与迁移实战

Yii 2.0 从 1.1 版本升级指南:核心差异、重构要点与迁移实战

后端Web框架 【免费下载链接】yii2 Yii 2: The Fast, Secure and Professional PHP Framework 项目地址: https://gitcode.com/gh_mirrors/yi/yii2 点击查看 免费下载 本篇升级指南以当前仓库(GitHub 加速计划 / yi / yii2)中的 docs/guide-…

2026/9/23 22:21:26 阅读更多 →
118、构建可扩展的Agent基础架构

118、构建可扩展的Agent基础架构

118、构建可扩展的Agent基础架构 那天晚上十一点,线上的Agent实例突然开始集体超时,日志里刷满了TooManyRequests,但我们的API配额明明还有余量。查了一整夜,最后发现根因不在模型服务,也不在业务代码,而在我们引以为傲的“灵活”的Agent调度层——每个请求进来都会动态…

2026/9/23 22:20:25 阅读更多 →
旅游景点情感分析:细粒度属性级建模与BERT微调实践

旅游景点情感分析:细粒度属性级建模与BERT微调实践

简介:本资源是一套面向计算机专业本科生的毕业设计实战项目,聚焦旅游景点评论的细粒度情感分析任务,适用于Python Web开发、自然语言处理与数据库应用等课程实践或毕设选题参考。项目基于Django框架构建Web系统,集成RNCC情感分析模…

2026/9/23 22:20:25 阅读更多 →

最新新闻

Apache DolphinScheduler 文档贡献完整指南:环境搭建、本地构建验证与文档 Pull Request 提交规范

Apache DolphinScheduler 文档贡献完整指南:环境搭建、本地构建验证与文档 Pull Request 提交规范

任务调度大数据后端前端 【免费下载链接】dolphinscheduler Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code 项目地址: https://gitcode.com/gh_mirrors/do/dolphinscheduler 点击查…

2026/9/23 22:58:10 阅读更多 →
你的课程论文,为什么写到一半就想删了重写?

你的课程论文,为什么写到一半就想删了重写?

官网:www.shujiangce.com | 微信 公众号 :书匠策AI 各位同学好,我是那个总在教你们写论文、但自己当年写课程论文也差点把键盘砸了的博主。 今天我们不聊那些听起来很爽的“一键生成万字长文”。那种东西你用一次就知道了——生成出来的文…

2026/9/23 22:58:10 阅读更多 →
答辩前夜,你打开PPT,新建了空白文档——书匠策AI说:别慌,先把“视觉剧本”写出来

答辩前夜,你打开PPT,新建了空白文档——书匠策AI说:别慌,先把“视觉剧本”写出来

官网:www.shujiangce.com | 微信 公众号 :书匠策AI 一个很少被提及的事实 论文写完了,答辩PPT没做完,这是一种比论文写不完更隐秘的崩溃。 因为你以为最难的部分已经过去了。文献综述写了,数据分析跑了&#xff…

2026/9/23 22:58:10 阅读更多 →
基于IPFS、Ethereum与ABE的区块链安全数据共享系统解析

基于IPFS、Ethereum与ABE的区块链安全数据共享系统解析

简介:一套结合IPFS、Ethereum与ABE(基于属性加密)的区块链安全数据共享系统设计源码,面向区块链开发者和数据安全研究人员,适用于金融、医疗、法律等对数据保护要求较高的场景。包内含2000个文件,压缩包约6…

2026/9/23 22:58:10 阅读更多 →
论文降AIGC,其实是在跟“太完美”作对

论文降AIGC,其实是在跟“太完美”作对

官网:www.shujiangce.com | 微信 公众号 :书匠策AI 你有没有想过一个问题:为什么检测器能认出AI写的东西? 不是因为它读懂了你的论文。不是因为它理解了你的论证。是因为AI写的东西,太“干净”了。 你写论文的时…

2026/9/23 22:58:09 阅读更多 →
substrate 内嵌的 cloud.google.com/go/compute/metadata 全解析:Google Cloud 实例元数据服务的 Go 客户端库

substrate 内嵌的 cloud.google.com/go/compute/metadata 全解析:Google Cloud 实例元数据服务的 Go 客户端库

人工智能AI AgentAgent 沙箱云原生容器运行时零信任 【免费下载链接】substrate Agent Substrate: the core system 项目地址&#xff1a; https://gitcode.com/GitHub_Trending/substrate7/substrate 点击查看 免费下载 <导读> 本文围绕 substrate 仓库&#xff08;Age…

2026/9/23 22:57:08 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事&#xff1a;用Flutter给OpenHarmony做一款游戏集合类的App&#xff0c;说白了就是把若干小游戏塞进一个壳里&#xff0c;用统一入口分发。这个方向本身不算新鲜&#xff0c;真正让我花了不少心思的&#xff0c;是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档&#xff0c;最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事&#xff1a;今天在表后面多加了两个空白行&#xff0c;明天给客户交稿前发现整个章节的编号全部错位&#xff0c;光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年&#xff0c;说实话&#xff0c;第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年&#xff0c;流量惨淡、功能臃肿、代码自己都懒得看第二遍之后&#xff0c;我才慢慢琢磨明白一个道理&#xff1a;第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →