7

I use .useDefaultResponseMessages(false) and in each method

@ApiResponses(value = {
        @ApiResponse(code = 200, message = "Success", response = Order.class),
        @ApiResponse(code = 401, message = "Unauthorized"),
        @ApiResponse(code = 403, message = "Forbidden"),
        @ApiResponse(code = 404, message = "Not Found"),
        @ApiResponse(code = 500, message = "Failure")})
public Order getOrder......

@ApiResponses(value = {
        @ApiResponse(code = 200, message = "Success", response = User.class),
        @ApiResponse(code = 401, message = "Unauthorized"),
        @ApiResponse(code = 403, message = "Forbidden"),
        @ApiResponse(code = 404, message = "Not Found"),
        @ApiResponse(code = 500, message = "Failure")})
public User getUser......

Can I combine some repeating annotations?(default)

user5620472
  • 2,722
  • 8
  • 44
  • 97

1 Answers1

5

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.

naXa stands with Ukraine
  • 35,493
  • 19
  • 190
  • 259
  • What if you want to add new annotation which is not from default set? is there a best way we could accommodate in the same annotation? As far as I have tried we have to specify @ApiResponses(...) again –  Jul 09 '20 at 13:48
  • @DeepakShinde yes, you are right. we can override `@ApiResponses` definition at method-level, and we have to specify defaults again if we do so. – naXa stands with Ukraine Jul 09 '20 at 20:11