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

时间:2015-11-01 05:55:31

标签: java generics swagger httpresponse

我有大约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类型,我将在控制器中返回Response作为API响应:

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

在控制器中:     响应数据= new Response();     ResponseEntity response = new ResponseEntity&lt;&gt;(data,HttpStatus.OK);

有没有办法招摇我可以递归地指定响应对象的模型?例如,我可以使用注释@ApiOperation(response = Response.class)但是没有A的模型。

4 个答案:

答案 0 :(得分:7)

我知道这是一篇旧帖子,但对于其他寻找答案的人来说:

可以对ListSetMap响应对象执行此操作,但将忽略具有泛型类型的任何其他类类。如果您使用这三个中的任何一个,那么您可以在responseContainer字段中指定它们,并在response字段中指定推断类型。

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

答案 1 :(得分:5)

我正在使用 swagger 2 ,以下为我解决了这个问题。

删除&#39; 回复&#39;来自@ApiResponse@ApiOperation的属性。然后,swagger将自动为方法存根中的 200 OK 生成响应类(无论是否在响应类中使用泛型)。

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

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

更新:您可以执行此简单的操作。只是说你想输出Response<MyClass>作为响应返回类型。你可以,

  • 在控制器类中,指定一个像这样的空私有类

    private MyResponseClass extends Response<MyClass>{}

  • 对于swagger规范,请指定如下,

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

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

答案 2 :(得分:0)

这个问题是在2015年提出的,但是我在2020年一直在寻找相同的东西。:)因此,认为添加在这里发现的内容很重要。

我了解到,我正在使用springdoc-openapi-ui(1.5.0),它取决于Swagger JAR。由于公共响应类采用通用的T,因此实际的API方法必须定义所需的类型。例如Response<Account>

如果这也是您的情况,那么定义schema的{​​{1}}属性似乎会使Swagger检查泛型并将其包含在架构中。 Swagger注释@ApiResponse -> @Content

同样适用

答案 3 :(得分:0)

我使用了 kotlin 就像那样

@ApiOperation(
            value = "Login with email",
            response  = test(Response<AccountResponse>())
    )


fun <T : Any> test(t: T): KClass<out T> = t::class