web-dev-qa-db-ja.com

Swagger API応答のジェネリック型クラスを指定する方法

次のような基本的な応答構造を持つ約40のAPIがあります。

{
    "lastAccessed": "2015-30-08:14:21:45T",
    "createdOn": "2015-30-07:09:04:10T",
    "lastModified": "2015-30-08:14:21:45T",
    "isReadOnly": "false",
    "usersAllowed" : ["Tim", "Matt", "Christine"];
    "noOfEntries": 1,
    "object": [
        "ObjectA": {
             //here object A has its own model
         }
    ]
}

したがって、次のようにタイプTのジェネリックを使用する基本応答クラスがあります。

public class Response<T> {
    @ApiModelProperty(value="Last time accessed")
    private String lastAccessed;
    @ApiModelProperty(value="Time when Created ")
    private String createdOn;
    private String lastModified;
    @ApiModelProperty(value="Created on")
    private boolean isReadOnly;
    @ApiModelProperty(value="Users that has access to the object.")
    private List<String> usersAllowed;
    private int noOfEntries;
    private T object;

    //getters and setters
}

したがって、独自のフィールドを持つタイプのオブジェクトを返すAPI Aの場合、コントローラーでAPI応答としてResponseを返します。

  public class A {
    @ApiModelProperty(value="Name")
    private String name;
    @ApiModelProperty(value="OID")
    private String id;    
    //getters and setters
}    

コントローラー:応答データ= new Response(); ResponseEntityレスポンス=新しいResponseEntity <>(data、HttpStatus.OK);

Swaggerで応答オブジェクトのモデルを再帰的に指定できる方法はありますか?たとえば、@ ApiOperation(response = Response.class)というアノテーションを付けることはできますが、Aのモデルはありません。

14
as3rdaccount

私はこれが古い投稿であることを知っていますが、これに対する答えを探している人のために:

これは、ListSet、およびMap応答オブジェクトに対して実行できますが、ジェネリック型を持つ他のクラスクラスはすべて無視されます。これらの3つのいずれかを使用している場合は、responseContainerフィールドでそれらを指定し、responseフィールドで推論された型を指定します。

@ApiResponse(code = 200, responseContainer="List", respone=Java.lang.String.class)
11
McLovin

私はswagger 2を使用しており、この問題を解決しました。

_@ApiResponse_と_@ApiOperation_の両方から 'response'プロパティを削除します。次に、swaggerは自動的に200 OKの応答クラスをメソッドスタブから生成します(ジェネリックの有無に関係なく)応答クラス)。

_@ApiOperation(value = "what your operation does")

@ApiResponses(value = { @ApiResponse(code = 200, message = "Success message") })
_

pdate:この簡単な回避策を実行できます。 _Response<MyClass>_を応答の戻り値の型として出力したいだけです。できるよ、

  • コントローラクラスで、このような空のプライベートクラスを指定します

    _private MyResponseClass extends Response<MyClass>{}_

  • そして、swagger仕様の場合、次のように指定します。

    @ApiResponse(code = 200, respone=MyResponseClass.class)

現時点では、swaggerはジェネリックをサポートしていません。上記の2つは回避策です。

11