如何在OpenAPI规范中引用基类并定制多态类型与属性名?
问题解答
1. OpenAPI规范中能否引用基类?
完全可以,核心是通过**discriminator(鉴别器)+ 继承Schema**来明确多态关系,让生成器识别基类而非生成新的包装类型。示例OpenAPI规范写法如下:
components: schemas: PolymorphicTypeBase: type: object discriminator: propertyName: type mapping: SubTypeA: '#/components/schemas/SubTypeA' SubTypeB: '#/components/schemas/SubTypeB' properties: type: type: string baseProperty: type: string SubTypeA: allOf: - $ref: '#/components/schemas/PolymorphicTypeBase' properties: subPropertyA: type: string SubTypeB: allOf: - $ref: '#/components/schemas/PolymorphicTypeBase' properties: subPropertyB: type: string ComplexType: type: object properties: polymorphicProperty: $ref: '#/components/schemas/PolymorphicTypeBase'
这样定义后,生成器会直接复用PolymorphicTypeBase作为ComplexType中属性的类型,不会生成额外的ComplexTypePolymorphicProperty包装类。关键是要让polymorphicProperty直接引用基类Schema,而非仅用oneOf罗列子类——oneOf可以配合基类使用,但核心是明确基类的继承关系。
2. 能否定制C#、TypeScript-Angular、Java生成器的类型与属性名?
可以,不同语言的生成器支持通过扩展字段或配置参数来定制命名,以下是具体方案:
C#
- 类型名定制:在Schema中添加
x-name扩展字段指定类名,比如:schemas: CustomNamedType: x-name: MyCustomCSharpType type: object - 属性名定制:用
x-property-name指定属性名,或通过配置参数控制命名策略:openapi-generator-cli generate -i openapi.yaml -g csharp -o ./csharp-client --additional-properties propertyNamingStrategy=PascalCase - 进阶:修改生成器的Mustache模板(可通过
--template-dir指定自定义模板目录)来完全控制代码结构。
TypeScript-Angular
- 类型名定制:用
x-typescript-name扩展字段:schemas: CustomType: x-typescript-name: MyAngularType type: object - 属性名定制:用
x-typescript-property-name指定属性名,或通过配置参数设置命名策略:openapi-generator-cli generate -i openapi.yaml -g typescript-angular -o ./ng-client --additional-properties propertyNamingStrategy=camelCase
Java
- 类型名定制:用
x-java-class扩展字段指定全限定类名:schemas: CustomJavaType: x-java-class: com.example.models.MyJavaModel type: object - 属性名定制:用
x-java-field指定字段名,或通过配置参数控制命名:openapi-generator-cli generate -i openapi.yaml -g java -o ./java-client --additional-properties propertyNamingStrategy=CAMEL_CASE,modelPackage=com.example.models
内容的提问来源于stack exchange,提问作者pjc89
相关产品推荐
相关产品推荐

