user5620472
user5620472

Reputation: 2882

swagger combine some repeating annotations

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)

Upvotes: 7

Views: 2899

Answers (1)

naXa stands with Ukraine
naXa stands with Ukraine

Reputation: 37916

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.

Upvotes: 5

Related Questions