OpenAPITools / openapi-generator

OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)
https://openapi-generator.tech
Apache License 2.0
21.79k stars 6.57k forks source link

[BUG][Regression] ImportMappings Do not work in V6.5.0 #15263

Open dpalmmna opened 1 year ago

dpalmmna commented 1 year ago
Description

The use of importMapping no longer works with v6.5.0 spring generator. The generated code uses List<@Valid Tag> where Tag is absolute reference to a class. This is not compatible with the @Valid annotation.

openapi-generator version

v6.5.0 worked in v6.4.0

OpenAPI declaration file content or url
openapi: 3.0.1
info:
  title: Computation Services Common
  description:Computation Services Common
  version: 1.0.0

paths: { }

components:
  schemas:
    MeshAnalysisParams:
      type: object
      properties:
        satellites:
          $ref: '#/components/schemas/Satellites'
        zoneOfInterest:
          $ref: 'model.yaml#/components/schemas/ZoneOfInterest'
        splitConstraint:
          $ref: 'model.yaml#/components/schemas/SplitConstraint'
    MeshAnalysisResponse:
      type: object
      properties:
        acqrs:
          type: array
          items:
            $ref: '#/components/schemas/MeshByAcqR'

    DtoAnalysisParams:
      type: object
      properties:
        satellites:
          $ref: '#/components/schemas/Satellites'
        period:
          $ref: 'model.yaml#/components/schemas/DateTimePeriod'
        meshesByAcqR:
          type: array
          items:
            $ref: '#/components/schemas/MeshByAcqR'
        solarAngleThreshold:
          type: number
          format: double
        skyBrightnessThreshold:
          type: number
          format: double
        depointingConstraint:
          $ref: 'model.yaml#/components/schemas/DepointingConstraint'

    DtoAnalysisParamsInstance:
      type: object
      properties:
        satellite:
          description: The name of the satellite.
          example: SAT1
          type: string
        period:
          $ref: 'model.yaml#/components/schemas/DateTimePeriod'
        meshesByAcqR:
          type: array
          items:
            $ref: '#/components/schemas/MeshByAcqR'
        solarAngleThreshold:
          type: number
          format: double
        skyBrightnessThreshold:
          type: number
          format: double
        depointingConstraint:
          $ref: 'model.yaml#/components/schemas/DepointingConstraint'

    DtoAnalysisResponse:
      type: object
      properties:
        dtosByAcqR:
          type: array
          items:
            $ref: '#/components/schemas/DtoByAcqR'

    MeshByAcqR:
      type: object
      properties:
        idAcqR:
          type: string
          description: "Id of the AcqR"
        meshes:
          type: array
          items:
            $ref: 'model.yaml#/components/schemas/Mesh'
    DtoByAcqR:
      type: object
      properties:
        idAcqR:
          type: string
          description: "Id of the AcqR"
        dtos:
          type: array
          items:
            $ref: 'model.yaml#/components/schemas/Dto'

    Satellites:
      description: The names of the satellites.
      example: [SAT1, SAT2]
      type: array
      items:
        type: string

    OrbitData:
      type: object
      properties:
        satName:
          type: string
        period:
          $ref: 'model.yaml#/components/schemas/DateTimePeriod'
    OrbitInfo:
      type: object
      properties:
        pos:
          type: array
          items:
            $ref: '#/components/schemas/OrbitPosition'
    OrbitPosition:
      type: object
      properties:
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
        altitude:
          type: number
          format: double

    SatelliteEphemerisPeriodResponse:
      type: object
      properties:
        satellite:
          type: string
          description: Name of the satellite
          example: SAT1
        period:
          $ref: 'model.yaml#/components/schemas/DateTimePeriod'
<plugin>
                <groupId>org.openapitools</groupId>
                <artifactId>openapi-generator-maven-plugin</artifactId>
                <version>6.5.0</version>
                <executions>
                    <execution>
                        <id>generate-server</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputSpec>${project.basedir}/target/generate-api/common.yaml</inputSpec>
                            <generatorName>spring</generatorName>
                            <generateSupportingFiles>true</generateSupportingFiles>
                            <supportingFilesToGenerate>ApiUtil.java</supportingFilesToGenerate>
                            <modelNamePrefix>Rest</modelNamePrefix>
                            <configHelp>false</configHelp>
                            <verbose>false</verbose>
                            <configOptions>
                                <delegatePattern>true</delegatePattern>
                                <java8>true</java8>
                                <dateLibrary>java8-localdatetime</dateLibrary>
                                <basePackage>package.mus.computation.common</basePackage>
                                <modelPackage>package.mus.computation.common.model</modelPackage>
                                <apiPackage>package.mus.computation.common.api</apiPackage>
                                <configPackage>package.mus.computation.common.config</configPackage>
                                <useOptional>false</useOptional>
                                <hateoas>false</hateoas>
                                <useSpringBoot3>true</useSpringBoot3>
                            </configOptions>
                            <schemaMappings>
                                <importMapping>DateTimePeriod=package.commons.api.model.RestDateTimePeriod
                                </importMapping>
                                <importMapping>UserOrder=package.commons.api.model.RestUserOrder</importMapping>
                                <importMapping>ProgR=package.commons.api.model.RestProgR</importMapping>
                                <importMapping>ZoneOfInterest=package.commons.api.model.RestZoneOfInterest
                                </importMapping>
                                <importMapping>SplitConstraint=package.commons.api.model.RestSplitConstraint
                                </importMapping>
                                <importMapping>
                                    DepointingConstraint=package.commons.api.model.RestDepointingConstraint
                                </importMapping>
                                <importMapping>
                                    DepointingConstraintElevation=package.commons.api.model.RestDepointingConstraintElevation
                                </importMapping>
                                <importMapping>
                                    DepointingConstraintRollPitch=package.commons.api.model.RestDepointingConstraintRollPitch
                                </importMapping>
                                <importMapping>AcqR=package.commons.api.model.RestAcqR</importMapping>
                                <importMapping>Mesh=package.commons.api.model.RestMesh</importMapping>
                                <importMapping>Dto=package.commons.api.model.RestDto</importMapping>
                                <importMapping>Dtoe=package.commons.api.model.RestDtoe</importMapping>
                                <importMapping>MeshPoint=package.commons.api.model.RestMeshPoint</importMapping>
                            </schemaMappings>
                        </configuration>
                    </execution>
                    <execution>
                        <id>generate-doc</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputSpec>${project.basedir}/target/generate-api/common.yaml</inputSpec>
                            <generatorName>dynamic-html</generatorName>
                            <configHelp>false</configHelp>
                            <output>${project.build.directory}/generated-docs/openapi/</output>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
package package.mus.computation.common.model;

import java.net.URI;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonTypeName;
import java.util.ArrayList;
import java.util.List;
import org.openapitools.jackson.nullable.JsonNullable;
import java.time.OffsetDateTime;
import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.*;
import jakarta.annotation.Generated;

/**
 * RestMeshByAcqR
 */

@JsonTypeName("MeshByAcqR")
@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2023-04-19T12:26:04.392255300+02:00[Europe/Paris]")
public class RestMeshByAcqR {

  private String idAcqR;

  @Valid
  private List<@Valid package.commons.api.model.RestMesh> meshes;

  public RestMeshByAcqR idAcqR(String idAcqR) {
    this.idAcqR = idAcqR;
    return this;
  }

  /**
   * Id of the AcqR
   * @return idAcqR
  */

  @Schema(name = "idAcqR", description = "Id of the AcqR", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
  @JsonProperty("idAcqR")
  public String getIdAcqR() {
    return idAcqR;
  }

  public void setIdAcqR(String idAcqR) {
    this.idAcqR = idAcqR;
  }

  public RestMeshByAcqR meshes(List<@Valid package.commons.api.model.RestMesh> meshes) {
    this.meshes = meshes;
    return this;
  }

  public RestMeshByAcqR addMeshesItem(package.commons.api.model.RestMesh meshesItem) {
    if (this.meshes == null) {
      this.meshes = new ArrayList<>();
    }
    this.meshes.add(meshesItem);
    return this;
  }

  /**
   * Get meshes
   * @return meshes
  */
  @Valid 
  @Schema(name = "meshes", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
  @JsonProperty("meshes")
  public List<@Valid package.commons.api.model.RestMesh> getMeshes() {
    return meshes;
  }

  public void setMeshes(List<@Valid package.commons.api.model.RestMesh> meshes) {
    this.meshes = meshes;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    RestMeshByAcqR meshByAcqR = (RestMeshByAcqR) o;
    return Objects.equals(this.idAcqR, meshByAcqR.idAcqR) &&
        Objects.equals(this.meshes, meshByAcqR.meshes);
  }

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

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class RestMeshByAcqR {\n");
    sb.append("    idAcqR: ").append(toIndentedString(idAcqR)).append("\n");
    sb.append("    meshes: ").append(toIndentedString(meshes)).append("\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(Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }
}

Jakarta validation does not accept private List<@Valid package.commons.api.model.RestMesh> meshes;

Generation Details
Steps to reproduce
Related issues/PRs

Introduced by issue #14959

Suggest a fix
jorgerod commented 11 months ago

Yes, I have the same problem in 7.1.0.

@dpalmmna have you found any workaround?

Thank you very much

Luharkk commented 7 months ago

@jorgerod @dpalmmna I am facing a different issue now with 7.4.0 version. In the generated code import for @Valid is not added. Example: public RestMeshByAcqR meshes(List<@Valid package.commons.api.model.RestMesh> meshes) { this.meshes = meshes; return this; } If I have any generated code like above with List<@Valid xyxxx> I am getting @Valid symbol doesn't found error during the compile phase. The import jakarta.validation.Valid is not getting added in the generated code.