我有一个简单的Spring Boot应用程序和一个REST端点来返回一个“Job”对象,它包含一个多态的列表,旁边是其他东西。我们采用Code First方法并尝试创建API模型以满足我们的需求。但是生成的Api Doc并不代表我们的模型完全复杂,因为它不能解析多态的列表。
Job对象看起来像
@Data // Lombok Getters and Setters
public final class Job {
private String foo;
private String bar;
private List<Condition> conditionList;
}
Condition是一组不同条件的父对象
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文档中?
我们通过改变结构“修复”了这个问题。所以这更像是一种解决方法。
我们现在使用“容器”类,而不是使用多态的List,它包含每种类型,因为它是自己的类型。
Condition对象变为“容器”或“管理器”类,而不是List。在Job类中,该字段现在定义为:
private Condition condition;
Condition类本身就是现在
public final class Condition{
private List<Internal> internalConditions;
// etc...
}
而且,例如,内部失去了它的父类型,现在只是
public final class Internal{
// Logic...
}
Swagger生成的JSON现在看起来像这样(摘录):
"Job": {
"Condition": {
"Internal": {
}
"External": {
}
//etc...
}
}