1. Use @ApiResponses
at controller level.
Define common responses at the controller level instead of repeating them for each method:
@ApiResponses({
@ApiResponse(code = 401, message = "Unauthorized"),
@ApiResponse(code = 403, message = "Forbidden"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 500, message = "Failure")})
@Controller
public class UserOrderController {
@ApiResponse(code = 200, message = "Success", response = Order.class)
@GetMapping("/order")
public Order getOrder() { /*......*/ }
@ApiResponse(code = 200, message = "Success", response = User.class)
@GetMapping("/user")
public User getUser() { /*......*/ }
}
And actually, it's not required to specify response
type in @ApiResponse
if it matches method return type. So, in the provided example, we can define all responses once per controller in order to reduce repeating annotations.
2. Use custom annotations
Share the repeating annotations between controllers by defining a custom annotation:
/**
* A convenient meta-annotation for Swagger API responses.
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ApiResponses({
@ApiResponse(code = 200, message = "Success"),
@ApiResponse(code = 401, message = "Unauthorized"),
@ApiResponse(code = 403, message = "Forbidden"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 500, message = "Failure")})
@interface DefaultApiResponses {}
Then use it like this:
@DefaultApiResponses
@Controller
public class UserOrderController {
@GetMapping("/order")
public Order getOrder() { /*......*/ }
@GetMapping("/user")
public User getUser() { /*......*/ }
}
The source code presented in this answer is available over on Github.