swagger-codegen icon indicating copy to clipboard operation
swagger-codegen copied to clipboard

[JAVA] swagger-codegen-maven-plugin : wrong generation with discriminator

Open Daemorinumi opened this issue 3 years ago • 1 comments

Description

The code generation seems to be incorrect I have 2 problems with swagger-codegen-maven-plugin on java and the library resttemplate.

I use the sample describe here https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/ with Pet, Dog inherited from Pet, Cat inherited from Pet.

use case 1 I created a schema for Person which have a pet (a Dog or a Cat). I specified a discriminator.propertyName : pet_type, but on the generated interface, i have :

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME,
  include = JsonTypeInfo.As.PROPERTY,
  property = "type")
@JsonSubTypes({
  @JsonSubTypes.Type(value = Cat.class, name = "Cat"),
  @JsonSubTypes.Type(value = Dog.class, name = "Dog")
})
public interface OneOfPersonPet {

}

The property should be pet_type (not type). Each time I try to call my endPoint, the objectMapper failed because of the required property type

use case 2 The other problem is that I have an endPoint /pets with take a Cat (Pet) or a Dog (Pet) into the body. After generation, the DefaultApi contains the method :

 public void petsPatch(PetsBody body) throws RestClientException {
        petsPatchWithHttpInfo(body);
   }

where PetsBody is a class whish is not related to a Dog, Cat or Pet. Just the same initerface OneOfpetsBody.

@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.JavaClientCodegen", date = "2022-02-24T22:04:37.021078+01:00[Europe/Paris]")@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "petType", visible = true )
@JsonSubTypes({
})

public class PetsBody implements OneOfpetsBody {

  @Override
  public boolean equals(java.lang.Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    return true;
  }

  @Override
  public int hashCode() {
    return Objects.hash();
  }


  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class PetsBody {\n");
    
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(java.lang.Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }

}

How can I create a cat and use the method petsPatch(PetsBody body) ? I miss something ?

Swagger-codegen version

swagger-codegen-maven-plugin version 3.0.33

Swagger declaration file content or url
openapi: "3.0.3"
info:
  title: "pet"
  version: "1.0"
tags:
  - name: pet
servers:
  - url: /rest/v1
paths:
  /pets:
    patch:
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/Cat'
                - $ref: '#/components/schemas/Dog'
              discriminator:
                propertyName: pet_type
      responses:
        '200':
          description: Updated
components:
  schemas:
    Pet:
      type: object
      required:
        - pet_type
      properties:
        pet_type:
          type: string
      discriminator:
        propertyName: pet_type
    Dog:    
      allOf:  
        - $ref: '#/components/schemas/Pet'
        - type: object
          properties:
            bark:
              type: boolean
            breed:
              type: string
              enum: [Dingo, Husky, Retriever, Shepherd]
    Cat:     
      allOf: 
        - $ref: '#/components/schemas/Pet'
        - type: object
          properties:
            hunts:
              type: boolean
            age:
              type: integer
    Person:
      properties:
        name:
          type : string
        pet:
          oneOf:
             - $ref: '#/components/schemas/Cat'
             - $ref: '#/components/schemas/Dog'
          discriminator:
            propertyName: pet_type
Command line used for generation

java 11 mvn clean install pom.xml

<plugin>
  <groupId>io.swagger.codegen.v3</groupId>
  <artifactId>swagger-codegen-maven-plugin</artifactId>
  <version>3.0.33</version>
  <executions>
    <execution>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <inputSpec>${project.basedir}/src/main/resources/folder/file-v1.yaml</inputSpec>
        <language>java</language>
        <library>resttemplate</library>
        <apiPackage>blabla.api</apiPackage>
        <modelPackage>blabla.model</modelPackage>
         <invokerPackage>blabla.handler</invokerPackage>
         <generateApiTests>false</generateApiTests>
         <generateApiDocumentation>false</generateApiDocumentation>
         <generateModelTests>false</generateModelTests>
         <generateModelDocumentation>false</generateModelDocumentation>
         <generateSupportingFiles>true</generateSupportingFiles>
         <configOptions>
           <interfaceOnly>true</interfaceOnly>
           <dateLibrary>java8</dateLibrary>
         </configOptions>
       </configuration>
     </execution>
   </executions>
</plugin> 

Regards

Daemorinumi avatar Feb 24 '22 21:02 Daemorinumi

3.0.59 and still generating broken code. It does not use the correct discriminator field name (it's always 'type') and the 'name' values in @JsonSubTypes are also wrong (does not use the values from the schema but probably just the class names)

Treverix avatar Sep 13 '24 21:09 Treverix