39

I have to debug a REST API Java project that has been developed using Swagger.I'm new to it, so I'm a little bit confused on how to do certain things. For example, here's one method:

@GET
@Path("/location/name")
@Produces({MediaType.APPLICATION_JSON})
@Operation(
    summary = "Get location information",
    tags = {"Information"},
    responses = {
        @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(implementation = LocationResponse.class)), description = "Get location information"),
        @ApiResponse(responseCode = "500", description = "Error: Internal Server Error")
    }
)
public Response searchLocationByName(
    @Parameter(description = "Location name", required = true) @DefaultValue("Barcelona") @QueryParam("name") String locationName
) { /* METHOD CODE */ }

The @ApiResponse for the code 200 is not of type LocationResponse but of type ArrayList<LocationResponse>, as it can return more than one location. What would be the correct syntax for this change? I've been reading the documentation at https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Annotations#operation-annotations but I couldn't find an appropriate example...

Thanks!

3 Answers 3

59

Use @ArraySchema instead of plain @Schema to define input or output data for array types.

Sign up to request clarification or add additional context in comments.

2 Comments

I saw the @ArraySchema annotation but I misunderstood the documentation and I thought that it wasn't what I needed... my fault. Now it's working with this annotation: @ApiResponse(responseCode = "200", content = @Content(array = @ArraySchema(schema = @Schema(implementation = LocationResponse.class))), description = "Get location information"),. Thanks!
Perfect answer. Related question: How does it work with generics in general? e.g. PageDto<ItemDto> ? Currently I can only provide PageDto.class. Is there a a way to provide type information to swagger? Thanks!
13

For the PageDto<T> we can simply create ResponseDto which extends PageDto<T> and use it in swagger as :

@ApiResponse(
  responseCode = "200",
  content = @Content(
  array = 
    @ArraySchema(
      schema = @Schema(implementation = ResponseDto.class))), 
      description = "Get location information"),

1 Comment

As a workaround I accept that. However I would assume there should be a way to do this without creating more classes just to make the documentation correctly understand the code. I opened a ticket to further investigate this: github.com/swagger-api/swagger-core/issues/3851
6

Code should look like this !!

@ApiResponses(
    value = {
      @ApiResponse(
          responseCode = "200",
          description = "Successful operation",
          content = @Content(
              mediaType = "application/json",
              array = @ArraySchema(
              schema = @Schema(implementation = LocationResponse.class))))
})

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.