I like Swagger
because it makes your apis very user friendly. I use Swagger
annotations like
- @ApiParam
- @ApiResponse | @ApiResponses
- @ApiOperation
- Others
On endpoints, query params, request params, request body and so on.
I like to keep my POJO
classes clean and in general I try my best to follow DRY
rule however, when it comes to swagger I noticed that I keep repeating myself over and over as shown below
@ApiOperation(value = "Retrieve object by id")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 400, message = "Bad Request"),
@ApiResponse(code = 500, message = "ISE")
})
public Response retrieveById(@ApiParam(value = "Some id") @PathParam("sid") int id) {
}
@ApiOperation(value = "Create object")
@ApiResponses(value = {
@ApiResponse(code = 201, message = "Created"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 400, message = "Bad Request"),
@ApiResponse(code = 500, message = "ISE")
})
public Response create(@ApiParam(value = "Request body") RequestBody body) {
}
How to avoid repeating yourself with Swagger annotations
?
I did some Googling around and came across this github issue and some other SO questions that are not directly related to
ApiResponses
annotations and none of them seem to present a working solution.Using
Swagger UI 2.0
I thought let's give it a try, so I did the followingGroupedApiResponses..
GroupedApiResponses..
with a group of Swagger annotationsGroupedApiResponses..
annotations on top of endpointsSee below
Similarly (you can group annotations as you want in one or more than one custom annotation depending on structure of your endpoints and the response messages it return)
And then I used the above
@GroupedApiResponsesAvecOk
onretrieveById
and@GroupedApiResponsesAvecCreated
oncreate
endpoint in place of@ApiResponses
and worked it just like before.As shown above, the
ApiResponse
annotations relating to400, 404, 500
can now be reused across other endpoints.