0

I have the following simple DTO:

public class AccountDto {
  @Schema(example = "1", hidden = true)
  private Long id;
  @Schema(example = "100")
  @NonNull private BigDecimal balance;
  @Schema(example = "USD")
  @NonNull private Currency currency;
}

And the following endpoint which returns a ResponseEntity with a body of org.springframework.hateoas.CollectionModel over org.springframework.hateoas.EntityModels of AccountDtos:

@GetMapping("/account")
  public ResponseEntity<CollectionModel<EntityModel<AccountDto>>> getAllAccounts() {
    return ResponseEntity.ok(
        accountModelAssembler.toCollectionModel(accountService.getAllAccounts()));
  }

An example of what my endpoint returns is:

{
  "_embedded": {
    "accountDtoList": [
      {
        "id": 7,
        "balance": 100,
        "currency": "AFN",
        "_links": {
          "self": {
            "href": "http://localhost:8080/bankapi/account/7"
          },
          "all_accounts": {
            "href": "http://localhost:8080/bankapi/account"
          }
        }
      },
      {
        "id": 8,
        "balance": 120,
        "currency": "USD",
        "_links": {
          "self": {
            "href": "http://localhost:8080/bankapi/account/8"
          },
          "all_accounts": {
            "href": "http://localhost:8080/bankapi/account"
          }
        }
      },
      {
        "id": 9,
        "balance": 100,
        "currency": "USD",
        "_links": {
          "self": {
            "href": "http://localhost:8080/bankapi/account/9"
          },
          "all_accounts": {
            "href": "http://localhost:8080/bankapi/account"
          }
        }
      }
    ]
  },
  "_links": {
    "self": {
      "href": "http://localhost:8080/bankapi/account"
    }
  }
}

I'm trying to emulate this pattern in the example response body of my OpenAPI specification. Influenced by the accepted answer here, I have this above my endpoint's definition in getAllAccounts() (notice the ref attribute of the @Schema annotation):

 @Operation(summary = "Get all accounts")
  @ApiResponses(value = {
          @ApiResponse(responseCode = "200", description = "All accounts successfully retrieved",
                  content = {
                      @Content(mediaType = "application/json",
                          schema = @Schema(ref = "#/components/schemas/CollectionModelAccountDto")) }),
          @ApiResponse(responseCode = "401", description = "Unauthenticated user",
                  content = @Content) })

and in the declaration of my @OpenAPI bean I attempt to define the schema CollectionModelAccountDto as follows:

 return new OpenAPI()
        .components(
            new Components()
                .addSchemas(
                    "CollectionModelAccountDto",
                    new Schema<CollectionModel<EntityModel<AccountDto>>>()
                        .addProperty(
                            "_embedded",
                            new ObjectSchema()
                                .addProperty(
                                    "accountDtoList",
                                    new ArraySchema().addProperty("foo", new ObjectSchema())))
                        .addProperty("_links", new JsonSchema()))
        .
        .
        .

My problem is that when I use the embedded ArraySchema as the value of the property "accountDtoList" that I have in the embedded ObjectSchema, OpenAPI does not seem to render the ObjectSchema at all:

The embedded ArraySchema is not rendered.

If, however, I change the type of the embedded Schema from ArraySchema to ObjectSchema (or even JsonSchema), then I get the entire object rendered at full depth:

The embedded ObjectSchema is rendered.

Of course this is not what I want, since the value associated with "accountDtoList" needs to be a list, not an object, but I don't quite understand why the rendering of the embedded ArraySchema does not work. Appreciate any advice.

Jason
  • 2,495
  • 4
  • 26
  • 37

0 Answers0