How to specify a generic type class for Swagger API response

江枫思渺然 提交于 2019-12-08 15:05:29

问题


I have about 40 APIs that have similar base response structure as follows:

{
    "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
         }
    ]
}

So I have a base response class taking a generic of type T as follows:

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
}

So for the API A, which returns the Object of type with its own fields, I am returning Response as the API response in the controller:

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

In the controller: Response data = new Response(); ResponseEntity response = new ResponseEntity<>(data, HttpStatus.OK);

Is there a way in swagger I can specify the model of the response object recursively? For example, I could have the annotation @ApiOperation(response=Response.class) but that would not have the model for A.


回答1:


I know this is an old post, but for anyone else looking for an answer to this:

This can be done for List, Set, and Map response objects but any other class class with generic types will be ignored. If you are using any of these three, then you specify them in the responseContainer field and your inferred type in the response field.

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



回答2:


I am using swagger 2 and following resolved this problem for me.

Remove 'response' property from both @ApiResponse and @ApiOperation. Then swagger will automatically generate the response class for you for 200 OK from method stubs (irrespective of whether with/without generics in response class).

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

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

Update: You can do this simple work around. Just say you want to output Response<MyClass> as response return type. You can do,

  • In controller class, specify an empty private class like this

    private MyResponseClass extends Response<MyClass>{}

  • And for the swagger spec, specify like this,

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

Remember that at the moment, swagger doesn't support generics. Above two are just workarounds.



来源:https://stackoverflow.com/questions/33459644/how-to-specify-a-generic-type-class-for-swagger-api-response

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!