我有一个带有一个REST端点的简单Spring Boot应用程序,用于返回一个“ Job”对象,该对象包含一个多态列表,以及其他内容。 我们采用“代码优先”方法,并尝试创建适合我们需求的API模型。但是生成的Api Doc不能完全代表我们的模型,因为它无法解析多态列表。
Job对象看起来像
@Data // Lombok Getters and Setters
public final class Job {
private String foo;
private String bar;
private List<Condition> conditionList;
}
条件是一组不同条件的父对象
public abstract class Condition {
}
条件的两个示例实现是
@Data
public final class Internal extends Condition {
private String nodeId;
}
和
@Data
public final class Timed extends Condition {
private ZonedDateTime timestamp;
}
REST控制器非常简单:
@RestController
@RequestMapping("/hello")
public class MyController {
@GetMapping
public ResponseEntity<Job> getJob() {
return new ResponseEntity<>(new Job(), HttpStatus.OK);
}
}
现在,当我打开Swagger UI并查看生成的定义时,元素conditionList
是一个空对象{}
我尝试在分类中使用@JsonSubTypes和@ApiModel,但是输出没有区别。我可能没有正确使用它们,或者Swagger不能完成工作,或者我只是盲目或愚蠢。
如何让Swagger将子类型包含在生成的api文档中?
答案 0 :(得分:1)
在使用Springfox 2.9.2的Swagger UI中有效显示多态响应似乎很困难(不可能?)。解决方法感到合理。
OpenAPI 3.0似乎改善了对多态性的支持。为了实现您的最初目标,我会
我们在多态性方面也遇到了类似的问题,但尚未尝试实现基于Spring REST Docs + restdocs-api-spec的解决方案。
答案 1 :(得分:0)
我们通过更改结构来“解决”该问题。因此,这更多是一种解决方法。
我们现在不再使用多态列表,而是使用“容器”类,该类包含每种类型作为其自身的类型。
Condition对象成为“容器”或“管理器”类,而不是List。 在Job类中,该字段现在定义为:
++ []
Condition类本身现在是
private Condition condition;
例如,内部失去了它的父类型,现在只是
public final class Condition{
private List<Internal> internalConditions;
// etc...
}
Swagger生成的JSON现在看起来像这样(摘录):
public final class Internal{
// Logic...
}