Springfox / Swagger не разрешает полиморфное поле - PullRequest
1 голос
/ 17 апреля 2019

У меня есть простое приложение 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;
}

Условие является родительским объектом для набора различных условий

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 и смотрю на сгенерированное определение, элемент conditionList является пустым объектом {}

Я пытался использовать @JsonSubTypes и @ApiModel на классифицированных, но не было никакой разницы в выводе. Возможно, я их не правильно использовал, или, возможно, Сваггер просто не в состоянии выполнить эту работу, или, может быть, я просто слепой или глупый.

Как я могу заставить Swagger включить подтипы в сгенерированный api doc?

1 Ответ

0 голосов
/ 23 апреля 2019

Мы «исправили» проблему, изменив структуру.Так что это скорее обходной путь.

Вместо того, чтобы использовать список полиморфных выражений, мы теперь используем класс «контейнер», который содержит каждый тип в качестве своего собственного типа.

Объект Condition сталкласс «контейнер» или «менеджер» вместо списка.В классе Job поле теперь определено как:

private Condition condition;

Теперь сам класс Condition

public final class Condition{
    private List<Internal> internalConditions;
    // etc...
}

И, например, Internal потерял свой родительский тип и теперьпросто

public final class Internal{
    // Logic...
}

Сгенерированный Swagger JSON теперь выглядит следующим образом (отрывок):

"Job": {
    "Condition": {
        "Internal": {
        }
        "External": {
        }
        //etc...
    }
}
...