システム開発で思うところ

Javaで主にシステム開発をしながら思うところをツラツラを綴る。主に自分向けのメモ。EE関連の情報が少なく自分自身がそういう情報があったら良いなぁということで他の人の参考になれば幸い

BeanParamがOpenAPIで出力されない(未解決)

困っていること

@QueryParamだったら出力できるのに、@BeanParamだと OpenAPIの出力が想定通りに出ない

実行環境

  • Payara Server 5.2022.3
  • Java 11

@QueryParamでやってみる

コントローラー

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  @Operation(summary = "ユーザー情報を検索します")
  @APIResponse(description = "UserResourse", responseCode = "200")
  public ResponseEntity<UserResourse> getUsersByQuery(
      @Parameter(name = "id", example = "1")
      @QueryParam("id") Integer id,
      @Parameter(name = "name", example = "name")
      @QueryParam("name") String name
  ) {
    var model = searchUser.findById(UserId.of(id)).orElseThrow();
    return ResponseEntity.success(UserResourse.from(model));
  }

OpenAPI(yaml

paths:
  /api/users:
    get:
      summary: ユーザー情報を検索します
      operationId: getUsersByQuery
      parameters:
      - name: id
        in: query
        required: false
        deprecated: false
        allowEmptyValue: false
        allowReserved: false
        schema:
          type: integer
        example: "1"
      - name: name
        in: query
        required: false
        deprecated: false
        allowEmptyValue: false
        allowReserved: false
        schema:
          type: string
        example: name
      responses:
        "200":
          description: UserResourse
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEntityUserResourse'
      deprecated: false

OpenAPI(画像)

思っている通りに出力されている

@BeanParamでやってみる

コントローラー

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  @Operation(summary = "ユーザー情報を検索します")
  @APIResponse(description = "UserResourse", responseCode = "200")
  public ResponseEntity<UserResourse> getUsersByQuery(@BeanParam UserQueryParam userQueryParam) {
    var model = searchUser.findById(UserId.of(userQueryParam.getId())).orElseThrow();
    return ResponseEntity.success(UserResourse.from(model));
  }

クエリ―クラス

/**
 * UserQueryParam.
 */
@lombok.Data
@lombok.NoArgsConstructor
@lombok.AllArgsConstructor
public class UserQueryParam {

  @Parameter(name = "id", example = "1")
  @QueryParam("id")
  private Integer id;

  @Parameter(name = "name", example = "name")
  @QueryParam("name")
  private String name;

}

OpenAPI(yaml

paths:
  /api/users:
    get:
      summary: ユーザー情報を検索します
      operationId: getUsersByQuery
      responses:
        "200":
          description: UserResourse
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEntityUserResourse'
      deprecated: false

OpenAPI(画像)

思っている通りに出力されない(困った)