ARTICLE DETAIL

资讯详情

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

swagger-codegen 生成 Jersey1 客户端的 Pet 模型详解:属性、枚举与源码实现

swagger-codegen 生成 Jersey1 客户端的 Pet 模型详解:属性、枚举与源码实现 开发工具代码生成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点击查看免费下载Pet 模型是 Swagger Petstore 示例中描述宠物对象的核心数据模型本文基于 swagger-codegen 仓库中 Java Jersey1 客户端生成样本的 Pet.md 文档结合 Pet.java 源码与 PetApiTest.java 测试用例系统讲解该模型的全部属性、状态枚举语义、Jackson 序列化机制以及实际编码用法。读完本文你将能读懂并正确使用 swagger-codegen 为任意 OpenAPI 定义生成的 Java POJO 模型类。模型概览Pet 对象的六个字段Pet 模型描述了一只宠物在商店系统中的完整信息唯一标识、所属分类、名称、照片 URL 列表、标签列表以及商店中的销售状态。按 Pet.md 的定义其属性结构如下NameTypeDescriptionNotesidLong宠物唯一标识[optional]categoryCategory宠物所属分类[optional]nameString宠物名称必填photoUrlsListString宠物照片 URL 列表必填tagsListTag宠物标签列表[optional]statusStatusEnum宠物在商店中的销售状态[optional]从表格可以看出6 个字段中只有name与photoUrls是必填项其余 4 个均为可选category与tags是两个嵌套对象类型分别引用 Category.md 与 Tag.md 对应的模型文档status则指向本文档内部定义的枚举类型StatusEnum。StatusEnum 状态枚举status字段不是普通的字符串而是一个受约束的枚举类型其取值在 Pet.md 中明确定义为三种NameValueAVAILABLEavailablePENDINGpendingSOLDsold即宠物在商店中只能处于「可售」「待售」「已售」三种状态之一任何其他字符串在反序列化时都无法通过枚举校验详见下文源码解析。源码级解析Pet.java 的实现细节字段定义与 Jackson 注解映射在 Pet.java 中6 个字段均使用com.fasterxml.jackson.annotation.JsonProperty注解绑定 JSON 属性名。值得注意的初始化差异源码结构印证private Long id null;、private Category category null;、private ListTag tags null;、private StatusEnum status null;四个可选字段默认均为nullprivate ListString photoUrls new ArrayListString();作为必填字段被初始化为空列表避免了空指针风险。链式 Fluent Setter 风格模型为每个字段同时提供了两种赋值方式标准的setXxx(...)方法以及返回this的链式方法如Pet id(Long id)、Pet name(String name)。这种由 swagger-codegen 生成的 fluent API 允许一条语句完成对象的完整构建Pet pet new Pet() .id(123L) .name(doggie) .addPhotoUrlsItem(http://foo.bar.com/1) .status(Pet.StatusEnum.AVAILABLE);其中addPhotoUrlsItem与addTagsItem是面向列表类型的辅助方法前者直接向已初始化的photoUrls添加元素后者则会在tags为 null 时先自动创建new ArrayListTag()再添加见 Pet.java。StatusEnum 内部枚举的序列化与反序列化状态枚举被定义为Pet的内部静态类StatusEnum其实现体现了典型的 Jackson 枚举双向映射模式Pet.javapublic enum StatusEnum { AVAILABLE(available), PENDING(pending), SOLD(sold); private String value; JsonValue public String getValue() { return value; } Override public String toString() { return String.valueOf(value); } JsonCreator public static StatusEnum fromValue(String value) { for (StatusEnum b : StatusEnum.values()) { if (b.value.equals(value)) { return b; } } return null; } }JsonValue标注在getValue()上使枚举在 JSON 序列化时输出原始字符串值如available而非枚举常量名AVAILABLEJsonCreator标注的静态工厂方法fromValue用于反序列化将 JSON 中的字符串转换回枚举当传入的字符串不匹配任何枚举值时方法返回null而不是抛出异常这一细节在实际使用中需要留意。equals / hashCode / toString 的自动生成swagger-codegen 同时生成了基于java.util.Objects的equals与hashCode实现比较范围覆盖全部 6 个字段Pet.javatoString()则通过内部的toIndentedString工具方法格式化输出所有字段便于日志打印与调试Pet.java。此外源码还使用io.swagger.annotations.ApiModelProperty注解保留了 OpenAPI 定义中的元信息例如name字段标注了required true与示例值doggiestatus字段保留了描述「pet status in the store」。关联模型Category 与 Tagcategory字段的类型为 Categorytags字段的元素类型为 Tag。两者都是结构最简单的两字段模型且所有字段均为可选CategoryidLong、nameString见 Category.mdTagidLong、nameString见 Tag.md。在编码时这两个嵌套对象同样通过new Category()/new Tag()构建后赋值给Pet或直接使用链式方法Category category new Category().id(1L).name(cats); Tag tag new Tag().id(1L).name(cute); Pet pet new Pet() .category(category) .addTagsItem(tag) .photoUrls(Arrays.asList(http://foo.bar.com/1, http://foo.bar.com/2));实战用法结合 PetApi 与测试用例在 API 调用中作为请求体与返回值Pet 模型主要在 PetApi 的增删改查接口中扮演「请求体」和「返回值」双重角色对应接口列表见 PetApi.md方法HTTP 请求描述addPetPOST /pet新增宠物deletePetDELETE /pet/{petId}删除宠物findPetsByStatusGET /pet/findByStatus按状态查询宠物findPetsByTagsGET /pet/findByTags按标签查询宠物getPetByIdGET /pet/{petId}按 ID 查询宠物updatePetPUT /pet更新宠物updatePetWithFormPOST /pet/{petId}表单更新宠物uploadFilePOST /pet/{petId}/uploadImage上传宠物图片例如新增宠物的调用方式是构造一个Pet对象作为body参数传入apiInstance.addPet(body)此时请求的 Content-Type 为application/json, application/xml见 PetApi.mdJackson 会根据Pet上的JsonProperty注解自动完成对象到 JSON 的序列化。测试用例中的构建模式PetApiTest.java 中的testGetPetByIdInObject给出了最完整的对象构建与断言范式可总结为可复用的createRandomPet模式测试中反复使用Pet pet new Pet(); pet.setId(TestUtils.nextId()); pet.setName(pet pet.getId()); Category category new Category(); category.setId(TestUtils.nextId()); category.setName(category category.getId()); pet.setCategory(category); pet.setStatus(Pet.StatusEnum.PENDING); ListString photos Arrays.asList(http://foo.bar.com/1); pet.setPhotoUrls(photos); api.addPet(pet); Pet fetched api.getPetById(pet.getId()); assertEquals(pet.getId(), fetched.getId()); assertEquals(fetched.getCategory().getName(), pet.getCategory().getName());该测试同时验证了两个关键行为其一Pet对象可通过api.addPet(pet)提交并随后用api.getPetById(pet.getId())完整回读PetApiTest.java其二findPetsByStatus查询返回的宠物列表中可以依据id精确匹配到刚提交的对象PetApiTest.java。这些用例证明生成的模型在 JSON 序列化/反序列化往返过程中能够保持字段一致性。状态字段的实践要点由于StatusEnum是受约束枚举构造请求时务必使用枚举常量如Pet.StatusEnum.AVAILABLE而非常量字符串这既保证了类型安全也能借助JsonValue正确序列化为接口约定的available文本而读取服务端返回时如果遇到未定义的状态值fromValue会返回null需要在业务代码中做好空值防护。小结通过 Pet.md 与 Pet.java 的对照可以发现swagger-codegen 生成的模型文档与源码始终保持一致属性表格对应字段声明Notes 列对应ApiModelProperty的 required 标注枚举表对应JsonValue/JsonCreator双向映射。阅读此类模型文档时结合同目录的 Category.md、Tag.md 与 PetApi.md 即可获得模型定义、嵌套结构与接口调用三个层面的完整信息。这套「文档 POJO 测试」的生成模式适用于 swagger-codegen 输出的所有语言客户端理解 Pet 模型的实现机理也就掌握了阅读任何生成模型代码的方法论。赞分享开发工具代码生成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 客户端 Ints 模型为例Swagger Codegen 整数枚举生成实战以 Java Jersey1 客户端 Ints 模型为例 Ints 是 swagger codegen 在 p开发工具代码生成API设计Binwalk进度显示实时状态监控与用户反馈机制Binwalk进度显示实时状态监控与用户反馈机制 在嵌入式固件分析、文件系统提取等场景中长时间运行的扫描任务需要可靠的进度反馈机制。Binwalk作为主流的开发工具代码生成API设计Swagger Codegen 生成的 Dart 客户端 Pet 模型属性解析与源码实现深度解读Swagger Codegen 生成的 Dart 客户端 Pet 模型属性解析与源码实现深度解读 导读 Pet 是 Swagger Petstore 示例中承开发工具代码生成API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表