我正在开发一个在 yaml 文件中设计的 Springboot REST API,如下所示。
/controller/myApi:
post:
tags:
- ...
operationId: postNewStudent
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StudentDto'
components:
schemas:
StudentDto:
type: object
properties:
prop1:
type: string
prop2:
studentType:
$ref: 'common\studentSchema.yaml#/components/schemas/studentType'
在我的studentSchema.yaml 文件中,studentType 定义如下
studentType:
type: string
description: |
....
oneOf:
- $ref: '#/components/schemas/studentType1'
- $ref: '#/components/schemas/studentType2'
example: DSCHM
studentType1:
type: string
description: ...
enum:
- ENUM_VAL1_1
- ENUM_VAL1_2
studentType2:
type: string
description: ...
enum:
- ENUM_VAL2_1
- ENUM_VAL2_2
这里的问题是我的 StudentType.java 是作为接口生成的,不能被接受为 StudentDto 的一部分。在尝试调用 API 时,我收到以下错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `...StudentDto` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer
如何实现 StudentType、StudentType1 和 StudentType2 之间的这种层次结构。 (要求之一是在 Swagger Ui 上提供可能性,将 StudentType1 和 StudentType2 视为 StudentDto 架构中 StudentType 的子类型)
非常感谢。
我修复了 OAS 描述和模式文件,但没有看到您的 Java 代码,很难为您提供进一步的帮助。 解析引用模式的能力取决于所使用的实现。
出于某些原因,您绝对不应该使用
$ref: common\studentSchema.yaml#/components/schemas/studentType
。主要的一个是 components
不是 JSON Schema 关键字,并且该关键字甚至不存在于您的 studentSchema.yaml
中,因此它永远不会解析。
common\studentSchema.yaml
的路径完全取决于您的实现如何读取该文件位置。我使用
../common
作为占位符来表明这是一个相对引用。
#openapi.yaml
components:
schemas:
StudentDto:
type: object
properties:
prop1:
type: string
studentType:
$ref: '../common/studentSchema.yaml`
#studentSchema.yaml
$schema: http://json-schema.org/draft-07/schema#
type: object
required:
- studentType
additionalProperties: false
properties:
studentType:
description: ""
type: string
oneOf:
- $ref: "#/$defs/studentType1"
- $ref: "#/$defs/studentType2"
example: DSCHM
$defs:
studentType1:
type: string
description: ...
enum:
- ENUM_VAL1_1
- ENUM_VAL1_2
studentType2:
type: string
description: ...
enum:
- ENUM_VAL2_1
- ENUM_VAL2_2