openapi-processor / openapi-processor/openapi-processor-spring

Inheritance support

Aberta
#159 1 comentário 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Linguagem predominante
Kotlin
Estrelas
56
Forks
11
Merge médio
2d 4h
PRs com merge (30d)
8

Descrição

Quite impressed with the toolset you created here.

I was curious about inheritance support so I tried it out with a minimal example:

openapi: 3.0.2
info:
  title: edit me
  version: 1.0.0
paths:
  /nothing:
    description: dummy
    get:
      responses:
        '200':
          description: empty
          content:
            'application/json':
              schema:
                $ref: '#/components/schemas/ChildSchema'
components:
  schemas:
    ParentSchema:
      type: object
      properties:
        parentAttr:
          type: string
    ChildSchema:
      allOf:
        - $ref: '#/components/schemas/ParentSchema'
        - type: object
          properties:
            childAttr:
              type: string

This yields a ChildSchema.java consisting of everything from the parent and child model:

public class ChildSchema {

    @JsonProperty("parentAttr")
    private String parentAttr;

    @JsonProperty("childAttr")
    private String childAttr;

    public String getParentAttr() {
        return parentAttr;
    }

    public void setParentAttr(String parentAttr) {
        this.parentAttr = parentAttr;
    }

    public String getChildAttr() {
        return childAttr;
    }

    public void setChildAttr(String childAttr) {
        this.childAttr = childAttr;
    }

}

Now specifying a discriminator results in inheritance in the generated code (at least for the openapi-generator project):

openapi: 3.0.2
info:
  title: edit me
  version: 1.0.0
paths:
  /nothing:
    description: dummy
    get:
      responses:
        '200':
          description: empty
          content:
            'application/json':
              schema:
                $ref: '#/components/schemas/ChildSchema'
components:
  schemas:
    ParentSchema:
      type: object
      discriminator:
        propertyName: className
      properties:
        parentAttr:
          type: string
    ChildSchema:
      allOf:
        - $ref: '#/components/schemas/ParentSchema'
        - type: object
          properties:
            childAttr:
              type: string

For this a special propertyName of className is used. If I run that in your playground with spring 2021.5 it complains about the property name which is not wrong strictly speaking:
The discriminator 'className' is not a property of this schema (code: 134)
If I run this locally with 2023.1.2 then this does not error but does not generate two classes with one inheriting from each other:

public class ChildSchema {

    @JsonProperty("parentAttr")
    private String parentAttr;

    @JsonProperty("childAttr")
    private String childAttr;

    public String getParentAttr() {
        return parentAttr;
    }

    public void setParentAttr(String parentAttr) {
        this.parentAttr = parentAttr;
    }

    public String getChildAttr() {
        return childAttr;
    }

    public void setChildAttr(String childAttr) {
        this.childAttr = childAttr;
    }

}

Expected result would have been:

public class ParentSchema {

    @JsonProperty("parentAttr")
    private String parentAttr;

    public String getParentAttr() {
        return parentAttr;
    }

    public void setParentAttr(String parentAttr) {
        this.parentAttr = parentAttr;
    }

}

public class ChildSchema extends ParentSchema {

    @JsonProperty("childAttr")
    private String childAttr;

    public String getChildAttr() {
        return childAttr;
    }

    public void setChildAttr(String childAttr) {
        this.childAttr = childAttr;
    }

}

Now this expectation could of course be wrong. My question now would be if this inheritance use case is supported and/or if I would have to do something differently to get the desired result. Thanks.

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Reproduza os exemplos mínimos de OpenAPI da issue no playground com spring 2021.5 e localmente com 2023.1.2. Compare a saída gerada de ParentSchema e ChildSchema com a hierarquia de classes separada esperada e determine então se o suporte à herança é pretendido e qual comportamento deve ser documentado ou alterado.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
java, kotlin, spring-boot
Domínio
api, backend, tooling
Tipo de issue
Funcionalidade
Dificuldade
5/5
Tempo estimado
Mais de uma semana
Status de atividade
Estagnada
Clareza
Precisa de esclarecimento
Facilidade para iniciantes
20/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.