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

Inheritance support

Ouverte
#159 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Kotlin
Étoiles
56
Forks
11
Merge moyen
2 j 4 h
PR mergées (30 j)
8

Description

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.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Reproduisez les exemples OpenAPI minimaux de l’issue dans le playground avec spring 2021.5 et localement avec 2023.1.2. Comparez la sortie générée de ParentSchema et ChildSchema avec la hiérarchie de classes séparées attendue, puis déterminez si la prise en charge de l’héritage est prévue et quel comportement devrait être documenté ou modifié.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
java, kotlin, spring-boot
Domaine
api, backend, tooling
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
20/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.