OpenAPI Yaml 如何定义 Enum 继承

问题描述 投票:0回答:1

我正在开发一个在 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 的子类型)

非常感谢。

java spring-boot yaml swagger-ui openapi
1个回答
0
投票

我修复了 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

    
© www.soinside.com 2019 - 2024. All rights reserved.