Korashen
Korashen

Reputation: 2191

Springfox / Swagger does not resolve polymorphic field

I'm having a simple Spring Boot application with one REST endpoint to return a "Job" object, which contains a list of polymorphics, next to other stuff. We go Code First approach and try to create the API models to fit our needs. But the generated Api Doc does not represent our model the in it's full complexity, as it does not resolve the list of polymorphics.

The Job object looks like

@Data // Lombok Getters and Setters
public final class Job {
    private String foo;
    private String bar;
    private List<Condition> conditionList;
}

Condition is a parent object for a set of different conditions

public abstract class Condition {

}

Two example implementations of a Condition would be

@Data
public final class Internal extends Condition {
    private String nodeId;
}

and

@Data
public final class Timed extends Condition {
    private ZonedDateTime timestamp;
}

The REST controller is stupidly simple:

@RestController
@RequestMapping("/hello")
public class MyController {

    @GetMapping
    public ResponseEntity<Job> getJob() {
        return new ResponseEntity<>(new Job(), HttpStatus.OK);
    }
}

Now, when I open the Swagger UI and look at the generated definition, the element conditionList is an empty object {}

I tried to use the @JsonSubTypes and @ApiModel on the classed, but there was no difference in the output. I might not have used them correctly, or maybe Swagger is just not able to fulfill the job, or maybe I'm just blind or stupid.

How can I get Swagger to include the Subtypes into the generated api doc?

Upvotes: 2

Views: 1608

Answers (2)

Lauri Harpf
Lauri Harpf

Reputation: 1488

Useful display of polymorphic responses in Swagger UI with Springfox 2.9.2 seems hard (impossible?). Workaround feels reasonable.

OpenAPI 3.0 appears to improve support for polymorphism. To achieve your original goal, I would either

  • Wait for Springfox to get Open API 3.0 support (issue 2022 in Springfox Github). Unfortunately, the issue has been open since Sept 2017 and there is no indication of Open API 3.0 support being added soon (in Aug 2019).
  • Change to Spring REST Docs, perhaps adding the restdocs-api-spec extension to generate Open API 3.0.

We have run into similar problems with polymorphism but have not yet attempted to implement a solution based on Spring REST Docs + restdocs-api-spec.

Upvotes: 1

Korashen
Korashen

Reputation: 2191

We "fixed" the problem by changing the structure. So it's more of a workaround.

Instead of using a List of polymorphics, we now use a "container" class, which contains each type as it's own type.

The Condition object became a "container" or "manager" class, instead of a List. In the Job class, the field is now defined as:

private Condition condition;

The Condition class itself is now

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

And, as example, the Internal lost it's parent type and is now just

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

The Swagger generated JSON now looks like this (excerpt):

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

Upvotes: 1

Related Questions