如何为 Swagger API 响应指定泛型类型类

2022-09-02 01:02:18

我有大约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,它返回具有自己字段的 Object 类型,我将响应作为控制器中的 API 响应返回:

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

在控制器中:响应数据 = 新的响应();ResponseEntity response = new ResponseEntity<>(data, HttpStatus.OK);

有没有办法在 swagger 中以递归方式指定响应对象的模型?例如,我可以将注释@ApiOperation(response=Response.class),但该注释将没有A的模型。


答案 1

我正在使用swagger 2,并遵循为我解决了这个问题。

从 和 中删除“响应”属性。然后,swagger 将从方法存根中自动生成 200 OK 的响应类(无论响应类中是否具有/不具有泛型)。@ApiResponse@ApiOperation

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

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

更新:您可以执行此简单的解决方法。假设您要输出为响应返回类型。你可以做到,Response<MyClass>

  • 在控制器类中,指定一个空的私有类,如下所示

    private MyResponseClass extends Response<MyClass>{}

  • 对于炫耀的规格,请像这样指定,

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

请记住,目前,swagger不支持泛型。以上两个只是解决方法。


答案 2

我知道这是一篇老文章,但对于其他任何寻找答案的人来说:

这可以对 、 和响应对象执行此操作,但任何其他具有泛型类型的类类都将被忽略。如果您使用的是这三者中的任何一个,则可以在字段中指定它们,并在字段中指定推断的类型。ListSetMapresponseContainerresponse

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

推荐