【问题标题】:swagger combine some repeating annotationsswagger 结合一些重复的注解
【发布时间】:2017-09-20 14:14:57
【问题描述】:

我在每个方法中都使用.useDefaultResponseMessages(false)

@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......

我可以合并一些重复的注释吗?(默认)

【问题讨论】:

    标签: spring swagger


    【解决方案1】:

    1。在控制器级别使用@ApiResponses

    在控制器级别定义通用响应,而不是为每个方法重复它们:

    @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() { /*......*/ }
    }
    

    实际上,如果@ApiResponse 匹配方法返回类型,则不需要指定response 类型。因此,在提供的示例中,我们可以为每个控制器定义一次所有响应,以减少重复注释。

    2。使用自定义注释

    通过定义自定义注解在控制器之间共享重复注解:

    /**
     * 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 {}
    

    然后像这样使用它:

    @DefaultApiResponses
    @Controller
    public class UserOrderController {
        @GetMapping("/order")
        public Order getOrder() { /*......*/ }
    
        @GetMapping("/user")
        public User getUser() { /*......*/ }
    }
    

    此答案中提供的源代码可通过Github 获得。

    【讨论】:

    • 如果你想添加不是默认设置的新注释怎么办?有没有最好的方法可以容纳在同一个注释中?据我尝试,我们必须再次指定@ApiResponses(...)
    • @DeepakShinde 是的,你是对的。我们可以在方法级别覆盖@ApiResponses 定义,如果这样做,我们必须再次指定默认值。
    猜你喜欢
    • 2016-07-28
    • 2020-06-27
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2016-05-01
    • 2014-07-09
    相关资源
    最近更新 更多