Swagger Codegen生成C#的OneOf接口无实现问题咨询
问题诊断与解决方案
核心原因:OAS结构与Swagger Codegen 3.x的兼容性问题
NHS电子处方服务的OAS定义中,oneOf区域的FHIR资源结构,和Swagger Codegen 3.x的C#生成器解析逻辑不匹配,再加上该版本对FHIR资源的命名、接口实现支持有局限,导致出现三类问题:
1. OneOf接口无实现类+错误生成CreateMedicationRequestResource
- 本质:OAS里
oneOf引用的是FHIR标准MedicationRequest资源,但Swagger Codegen 3.x无法自动把FHIR资源映射为实现oneOf接口的类,反而错误生成了冗余的CreateMedicationRequestResource类(这类带Create前缀的类是生成器对POST请求体的误推导)。 - 临时解决:手动创建
MedicationRequest类并实现OneOfR4PrepareBodyEntryItems接口,把CreateMedicationRequestResource的属性迁移过来,保证请求体结构符合FHIR规范。
2. 接口未添加I前缀
- 本质:Swagger Codegen 3.x的C#生成器默认不给oneOf生成的接口加I前缀,这是版本默认行为,不是配置错误。
- 解决:
- 方案一:手动把接口重命名为
IOneOfR4PrepareBodyEntryItems - 方案二:自定义模板修改生成逻辑:
- 下载Swagger Codegen的C#生成器模板文件
- 修改
api.mustache或model.mustache里的接口命名规则,添加I前缀 - 生成时通过
-t参数指定自定义模板路径:java -jar .\swagger-codegen-cli.jar generate -i https://digital.nhs.uk/restapi/oas/324177 -l csharp -t ./custom-csharp-templates
- 方案一:手动把接口重命名为
3. 工具版本优化建议
Swagger Codegen 3.x对FHIR这类复杂医疗API支持不完善,建议换成OpenAPI Generator(Swagger Codegen的继任项目),它对FHIR和oneOf的解析更准确:
- 替换命令:
它能准确生成实现oneOf接口的FHIR资源类,还可通过配置参数控制接口前缀。java -jar openapi-generator-cli.jar generate -i https://digital.nhs.uk/restapi/oas/324177 -g csharp
总结
主要问题是OAS的FHIR特定结构与Swagger Codegen 3.x兼容性不足,其次是版本默认行为限制。优先尝试升级到OpenAPI Generator,若必须用Swagger Codegen,就手动调整类和接口结构。
内容的提问来源于stack exchange,提问作者amarsha4
相关产品推荐
相关产品推荐

