我有大约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的模型。
答案 0 :(得分:7)
我知道这是一篇旧帖子,但对于其他寻找答案的人来说:
可以对List
,Set
和Map
响应对象执行此操作,但将忽略具有泛型类型的任何其他类类。如果您使用这三个中的任何一个,那么您可以在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