How to return different objects for different response codes in Swagger-generated REST API?

Viewed 293

I want to respond with different result objects in a Swagger generated API. The type of object is dependent on the result code. But it seems that the Swagger codegen generates only code that allows the first defined/used type to be returned.

An example Swagger definition that returns different objects in the OK and error case is like:

swagger: "2.0"
info:
  description: "API"
  version: 1.0.0
  title: Example
host: localhost:8080

schemes:
  - http

paths:
  /exampleCall:
    get:
      operationId: exampleCall
      produces:
        -  application/json
      responses:
        200:
          description: OK
          schema:
            $ref: '#/definitions/exampleResponse'
        400:
          description: Error
          schema:
            $ref: '#/definitions/exampleError'
definitions:
  exampleResponse:
    type: object
    properties:
      result:
        type: string
  exampleError:
    type: object
    properties:
      code:
        type: string

This then gets generated by the SwaggerCodeGen into following API interface

@Validated
@Api(value = "exampleCall", description = "the exampleCall API")
@RequestMapping(value = "")
public interface ExampleCallApi {

    ExampleCallApiDelegate getDelegate();

    @ApiOperation(value = "", nickname = "exampleCall", notes = "", response = ExampleResponse.class, tags={  })
    @ApiResponses(value = { 
        @ApiResponse(code = 200, message = "OK", response = ExampleResponse.class),
        @ApiResponse(code = 400, message = "Error", response = ExampleError.class) })
    @RequestMapping(value = "/exampleCall",
        produces = { "application/json" }, 
        method = RequestMethod.GET)
    default ResponseEntity<ExampleResponse> exampleCall() {
        return getDelegate().exampleCall();
    }
}

But when I try to implement the delegate like this

public class ExampleCallApiDelegateImpl implements ExampleCallApiDelegate {

    @Override
    public ResponseEntity<ExampleResponse> exampleCall() {
        ExampleError error = new ExampleError();
        error.setCode("123");
        return new ResponseEntity<ExampleError>(error, HttpStatus.BAD_REQUEST);
    }
}

it of course fails to compile because of incorrect return types.

What would be the proper way to implement different return objects per response code with that Swagger generated API? Is there even a proper way?

0 Answers
Related