4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

openapi-generatorをバージョンアップしたらimportMappingsが動かなくなった

Last updated at Posted at 2022-12-13

この記事はZOZO Advent Calendar 2022 #4 14日目の記事になります。

はじめに

openapi-generatorをバージョンアップしたらimportMappingsが動かなくなったので原因と対応をまとめます。

openapi-generatorとは

OpenAPI Specificationを元にクライアントやサーバのコードを生成するソフトウェアです。

importMappingsとは

変換に伴いインポートする型のテンプレートを指定するopenapi-generatorの機能です。

何が起こったのか

以下のようなソースを用意しバージョンアップしたopenapi-generatorを実行したところ、
importMappingsが正常に動かない事象が発生しました。

yaml

paths:
  '/user':
    get:
      operationId: getUserList
      summary: |
        ユーザーAPI。
      description: |
        ユーザーリストを取得します。
      parameters:
        - description: |
            ユーザー性別
            1: 男性
            2: 女性
          in: query
          name: gender
          required: false
          schema:
            $ref: '#/components/schemas/gender'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/user_response'
          description: 200 (OK)
          headers:
            http_status:
              description: HTTPステータス
              schema:
                type: integer
components:
  schemas:
    gender:
      enum:
        - 1
        - 2
      example: 1
      type: integer
      x-enum-varnames:
        - MEN
        - WOMEN
    user_response:
      example:
        result:
          - name: 山田
        status: 200
      properties:
        result:
          items:
            $ref: '#/components/schemas/user_response'
          type: array
        status:
          example: 200
          format: int32
          type: integer
      type: object
    user_response:
      example:
        name: 山田
      properties:
        name:
          description: 名前
          example: 名前
          type: string
      required:
        - name
      type: object

MemberGender.java


public enum Gender {
  MEN(),
  WOMEN();

  private final Integer value;

  public static Gender of(int value) {
    var match = Arrays.stream(Gender.values()).filter(it -> it.value == value).findFirst();
    return match.orElseThrow(() -> new IllegalArgumentException("誤りがあります:" + value));
  }

  @SneakyThrows
  @JsonCreator
  public static Gender of(String value) {
    return of(Integer.parseInt(value));
  }

  @JsonValue
  public int getValue() {
    return value;
  }
}

build.gradle

openApiGenerate {
    typeMappings = [
            gender: 'com.example.springboot.Gender'
    ]
    importMappings = [
            gender: 'com.example.springboot.Gender'
    ]
{

上記を用意してOpenAPI Generatorによって以下のようなメソッドが生成されていた

    default ResponseEntity<UserResponse> getUserList(@ApiParam(value = "ユーザー性別 1: 男性 2: 女性 ", allowableValues = "1, 2") @Valid @RequestParam(value = "gender", required = false) com.example.springboot.Gender Gender) {
        ....
    }

Genderの型がimportMappingsで指定した「com.example.springboot.Gender」になっている。
ところが、openapi-generatorをバージョンアップしたら以下のようになった

    default ResponseEntity<UserResponse> getUserList(@ApiParam(value = "ユーザー性別 1: 男性 2: 女性 ", allowableValues = "1, 2") @Valid @RequestParam(value = "gender", required = false) Gender Gender) {
        ....
    }

importMappingがうまく動かず型が「Gender」になっている。

原因

openapi-generatorのv5.4.0からimportMappingsが動かなくなるバグが発生しているらしい。

対応

v6.0.0以降で「schemaMappings」で同様のことができるようになった

openApiGenerate {
    typeMappings = [
            gender: 'com.example.springboot.Gender'
    ]
    schemaMappings = [
            gender: 'com.example.springboot.Gender'
    ]
{

上記のように変更したことでテンプレートの指定ができるようになった。

参考にした資料

[BUG][openapi-generator-maven-plugin] importmapping not respected since 5.4.0
【Spring Boot】OpenAPI GeneratorのType Mappingで自作のドメインオブジェクトを使用する

4
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?