Springfox / Swagger无法解析多态字段

时间:2019-04-17 13:42:42

标签: java spring-boot polymorphism swagger springfox

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

2 个答案:

答案 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...
}