Reputation: 95
I have different RestAPI methods that correspond to endpoints and I would like to share their @ApiResponses to avoid code duplication. I basically have the following annotation to 8 different methods and I would like ideally to define it only once.
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 400, message = "Bad Request", response = ResourceErrorModel.class),
@ApiResponse(code = 401, message = "Unauthorized", response = ResourceErrorModel.class),
@ApiResponse(code = 403, message = "Forbidden", response = ResourceErrorModel.class),
@ApiResponse(code = 404, message = "Not Found", response = ResourceErrorModel.class),
@ApiResponse(code = 409, message = "Conflict", response = ResourceErrorModel.class),
@ApiResponse(code = 422, message = "Unprocessable Entity", response = ResourceErrorModel.class),
@ApiResponse(code = 424, message = "Failed Dependency", response = ResourceErrorModel.class)})
Upvotes: 4
Views: 1624
Reputation: 130857
You could create your own annotation, which is annotated with @ApiResponses
:
@Retention(RUNTIME)
@Target({METHOD, TYPE})
@ApiResponses({
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 400, message = "Bad Request", response = ResourceErrorModel.class),
@ApiResponse(code = 401, message = "Unauthorized", response = ResourceErrorModel.class),
@ApiResponse(code = 403, message = "Forbidden", response = ResourceErrorModel.class),
@ApiResponse(code = 404, message = "Not Found", response = ResourceErrorModel.class),
@ApiResponse(code = 409, message = "Conflict", response = ResourceErrorModel.class),
@ApiResponse(code = 422, message = "Unprocessable Entity", response = ResourceErrorModel.class),
@ApiResponse(code = 424, message = "Failed Dependency", response = ResourceErrorModel.class)})
public @interface DefaultApiResponses {
}
Then simply annotate your controller methods:
@GetMapping("/foo")
@DefaultApiResponses
public Response<Foo> getFoo() {
...
}
Upvotes: 4
Reputation: 1088
Create a custom interface as CustomAPIResponse
as below:
@Target({METHOD, TYPE})
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 400, message = "Bad Request", response = ResourceErrorModel.class),
@ApiResponse(code = 401, message = "Unauthorized", response = ResourceErrorModel.class),
@ApiResponse(code = 403, message = "Forbidden", response = ResourceErrorModel.class),
@ApiResponse(code = 404, message = "Not Found", response = ResourceErrorModel.class),
@ApiResponse(code = 409, message = "Conflict", response = ResourceErrorModel.class),
@ApiResponse(code = 422, message = "Unprocessable Entity", response = ResourceErrorModel.class),
@ApiResponse(code = 424, message = "Failed Dependency", response = ResourceErrorModel.class)})
public @interface CustomAPIResponse{}
Then over your each controller method of REST API simply annotate the function with @CustomAPIResponse
. This will simply add all of the annotations mentioned in CustomAPIResponse
class.
You can create multiple such type of @interface
class & also single function can be annotated with multiple custom annotations as created above.
Upvotes: 4
Reputation: 3410
You could try to create your own annotation and add it on your methods:
@Target(value=METHOD)
@Retention(value=RUNTIME)
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 400, message = "Bad Request", response = ResourceErrorModel.class),
@ApiResponse(code = 401, message = "Unauthorized", response = ResourceErrorModel.class),
@ApiResponse(code = 403, message = "Forbidden", response = ResourceErrorModel.class),
@ApiResponse(code = 404, message = "Not Found", response = ResourceErrorModel.class),
@ApiResponse(code = 409, message = "Conflict", response = ResourceErrorModel.class),
@ApiResponse(code = 422, message = "Unprocessable Entity", response = ResourceErrorModel.class),
@ApiResponse(code = 424, message = "Failed Dependency", response = ResourceErrorModel.class)})
public @interface SomeCustomAnnotation {}
Upvotes: 4