Springfox / Swagger无法解析多态字段

问题描述 投票:1回答:1

我有一个简单的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文档中?

java spring-boot polymorphism swagger springfox
1个回答
0
投票

我们通过改变结构“修复”了这个问题。所以这更像是一种解决方法。

我们现在使用“容器”类,而不是使用多态的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...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.