We have an OpenAPI spec file where we've defined multiple possible responses for an operation, however when the Spring code is generated the generated @RequestMapping method is only capable of returning the first response defined.
3.2.3
openapi: "3.0.0"
info:
title: "Example"
version: "1.0.0"
servers:
- url: "/api/v1"
- url: "/api/"
tags:
- name: "example"
paths:
"/example":
get:
tags:
- "example"
operationId: "examples"
summary: "Get examples that match criteria"
parameters:
- name: "id"
in: query
description: "the identifier to get"
required: true
responses:
200:
description: "Success"
content:
application/json:
schema:
$ref: "#components/schemas/ExampleObject"
404:
description: "Failed to find the Example Object"
content:
application/json:
schema:
$ref: "#components/schemas/Errors"
components:
schemas:
"ExampleObject":
type: object
properties:
"property1":
type: string
"property2":
type: string
"Errors":
type: object
properties:
"code":
type: integer
format: int32
"severity":
type: string
"message":
type: string
<pluginExecutor>
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>3.2.3</version>
</plugin>
<goal>generate</goal>
<configuration>
<inputSpec>api-def/spec.yml</inputSpec>
<generatorName>spring</generatorName>
<output>api-gen</output>
<modelNamePrefix>Api</modelNamePrefix>
<configOptions>
<basePackage>package</modelPackage>
<apiPackage>package</apiPackage>
<groupId>group</groupId>
<artifactId>api-gen</artifactId>
<artifactVersion>${project.version}</artifactVersion>
<artifactDescription>Automatically generated interfaces for APIs</artifactDescription>
<interfaceOnly>true</interfaceOnly>
</configOptions>
</configuration>
</pluginExecutor>
Generate the Spring code using the specified spec file and maven configuration.
The following @RequestMapping is generated:
@ApiOperation(value = "Get examples that match criteria", nickname = "examples", notes = "", response = ApiExampleObject.class, tags={ "example", })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Success", response = ApiExampleObject.class),
@ApiResponse(code = 404, message = "Failed to find the Example Object", response = ApiErrors.class) })
@RequestMapping(value = "/example",
produces = { "application/json" },
method = RequestMethod.GET)
default ResponseEntity<ApiExampleObject> examples(@NotNull @ApiParam(value = "the identifier to get", required = true) @Valid @RequestParam(value = "id", required = true) ) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
ApiUtil.setExampleResponse(request, "application/json", "{ \"property2\" : \"property2\", \"property1\" : \"property1\"}");
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
}
The return type is of ResponseEntity<ApiExampleObject> which means I can't return an ApiErrors object.
Sounds similar to #316
Get the method to return an object that can encapsulate one of the types defined in the response.
Or a simpler option is to get the method to return a ResponseEntity<Object>.
I wonder that this issue has such a low activity. Is there any recommended workaround, or do you plan to fix it in an upcoming release?
Is there any update on this issue? we are facing the same problem where we have to return different objects depending on the status of the response....