Swagger Spring 多态 DTO

Swagger Spring polymorphic DTO

我正在使用 swagger 生成我的 DTO。 我有一个 InputField 和一个 TextareaField DTO,它们继承了 Field class.

我的 yaml 有以下定义:

definitions:
  field:
    discriminator: fieldType
    required:
      - name
      - fieldType # required for inheritance to work
    properties:
      name:
        type: string
      fieldType:
        type: string
  inputField:
    allOf:
      - $ref: '#/definitions/field' # All properties of a Field
      - properties: # extra properties only for fields
          placeholder:
            type: string
  textareaField:
    allOf:
      - $ref: '#/definitions/field' # All properties of a Field
      - properties: # extra properties only for fields
          placeholder:
            type: string
  form:
    type: object
    required:
      - name
    properties:
      name:
        type: string
      fields:
        type: array
        items:
          $ref: '#/definitions/field'

然后在我的 spring 端点中,我有以下 REST 控制器:

@Override
public ResponseEntity<Void> addForm(@ApiParam(value = "form object to add to the store", required = true) @RequestBody Form form) {

    if(form.getFields().isEmpty()){
        return  new ResponseEntity<>(HttpStatus.UNPROCESSABLE_ENTITY);
    }

    ch.test.form.database.model.Form formModel = new ch.test.form.database.model.Form();
    formModel.setName(form.getName());

    for(Field field: form.getFields()){
        System.out.println(field);
        switch(field.getFieldType()){
            case "InputField":
                formModel.addField(new InputField(field.getName(), ((ch.test.form.api.dto.InputField)field).getPlaceholder()));
                break;
            case "TextareaField":
                formModel.addField(new TextareaField(field.getName(), ((ch.test.form.api.dto.TextareaField)field).getPlaceholder()));
                break;
        }
    }

    formModel.setUser(user);

    try{
        formRepository.save(formModel);
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.set("location", "/pointScales/" + formModel.getId());
        return ResponseEntity.status(HttpStatus.CREATED).headers(responseHeaders).build();
    } catch (DataIntegrityViolationException e){
        System.out.println(e.getMessage());
        System.out.println(e.getClass());
        return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).build();
    }
}

我在使用以下 json 创建新输入字段时遇到此异常 java.lang.ClassCastException: ch.test.form.api.dto.Field cannot be cast to ch.test.form.api.dto.InputField :

{
"fields": [
    {
      "fieldType": "InputField",
      "name": "string",
      "placeholder": "test"
    }
  ],
  "name": "string"
}

我做错了什么?创建 dto 时是否缺少注释 swagger?

我删除了 swagger 代码生成,因此我可以自己配置 DTO 并添加 @JsonTypeInfo 注释。