web-dev-qa-db-ja.com

OpenApi3.0でスキーマ定義としてプロパティを生成します

Swagger 2.0を使用すると、Java.util.Currencyクラスが個別の定義として生成されました。しかし、OpenAPI 3.0を生成すると、swagger-coreがそれをプロパティとして生成するという問題が発生します。


クラスからのOpenAPI3.0仕様の生成

私たちはf.eを持っています。このクラス:

import Java.util.Currency; 

public class Wrapper {
   private Currency currency;
}

このコードから、次のプラグイン構成でopenapi仕様を生成します。

      <plugin>
            <groupId>io.swagger.core.v3</groupId>
            <artifactId>swagger-maven-plugin</artifactId>
            <version>2.0.9</version>
            <configuration>
                <outputFileName>openapi</outputFileName>
                <outputFormat>YAML</outputFormat>
                <outputPath>....</outputPath>
                <resourcePackages>...</resourcePackages>
            </configuration>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>resolve</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

これが生成されると、次のコンポーネント定義になります。

components:
  schemas:
    Wrapper:
      type: "object"
      properties:
        currency:
          type: object
          properties:
            currencyCode:
              type: string
            defaultFractionDigits:
              type: integer
              format: int32
            numericCode:
              type: integer
              format: int32
            displayName:
              type: string
            symbol:
              type: string

OpenAPI3.0仕様からのクラスの生成

次に、次のプラグインを使用して別のプロジェクトでクラスを生成します。

クラスを生成するためのコードは、このopenapi仕様を形成します。

        <plugin>
            <groupId>org.openapitools</groupId>
            <artifactId>openapi-generator-maven-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
                <execution>
                    <id>openapi-generation</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <inputSpec>${project.basedir}/src/main/resources/swagger.yaml</inputSpec>
                        <language>Java</language>
                        <library>jersey2</library>
                        <generateSupportingFiles>false</generateSupportingFiles>
                        <configOptions>
                            <booleanGetterPrefix>is</booleanGetterPrefix>
                            <dateLibrary>threetenbp</dateLibrary>
                            <import-mappings>
                                Currency=Java.util.Currency
                            </import-mappings>
                        </configOptions>
                        <generateApis>false</generateApis>
                        <generateApiDocumentation>false</generateApiDocumentation>
                        <generateModelTests>false</generateModelTests>
                        <generateModelDocumentation>false</generateModelDocumentation>
                    </configuration>
                </execution>
            </executions>
        </plugin>

これにより、WrapperCurrencyという名前のクラスが作成されます。 --import-mappingsオプションはプロパティであり、schemaではないため、機能していないようです。これは、通貨が個別のスキーマ定義として生成される場合に機能します。


望ましい結果

Java.util.Currencyがスキーマとして生成されるようにプロパティに注釈を付ける方法はありますか?次のようなもの:

components:
  schemas:
    Wrapper:
      type: "object"
      properties:
        currency:
           $ref: "components/schemas/Currency"

    Currency:
      type: object
      properties:
        currencyCode:
          type: string
        defaultFractionDigits:
          type: integer
          format: int32
        numericCode:
            type: integer
            format: int32
        displayName:
          type: string
        symbol:
          type: string

または、--import-mappingsオプションをオブジェクトではなくプロパティにバインドする方法はありますか?

6
Ivar Reukers

回避策を検討することもできます。通貨フィールドに注釈@Schema(ref = "Currency")を追加すると、プラグインはプロパティの生成をスキップします。残念ながら、Currencyクラスのスキーマ定義も生成されません。

components:
  schemas:
    Wrapper:
      type: object
      properties:
        currency:
          $ref: '#/components/schemas/Currency'

とにかくJava.util.Currencyにマッピングし直しているので、それがあなたにとって問題であるかどうかはわかりません。しかし、そうである場合は、別のハックがあります。静的ファイルに部分的なスキーマ(通貨定義のみ)を提供し、生成されたスキーマ(openapiFilePathパラメーター)とマージするようにプラグインを構成できます。

プラグイン構成:

      <plugin>
            <groupId>io.swagger.core.v3</groupId>
            <artifactId>swagger-maven-plugin</artifactId>
            <version>2.0.9</version>
            <configuration>
                ...
                <openapiFilePath>src/main/resources/currency.yaml</openapiFilePath>
                ...
            </configuration>
            ...
      </plugin>

currency.yaml:

components:
  schemas:
    Currency:
      type: object
      properties:
        currencyCode:
          type: string
        defaultFractionDigits:
          type: integer
          format: int32
        numericCode:
          type: integer
          format: int32
        displayName:
          type: string
        symbol:
          type: string

それはハックだと私は知っていますが、他に選択肢がない場合は...

2
Mafor