Swagger Spring Annotations:正确的响应格式

时间:2017-01-23 09:20:00

标签: java spring spring-mvc swagger

我有Swagger代码注释用于文档目的,类似于以下内容:

@RequestMapping(value = "/campaigns/{campaignUuid}",
                method = RequestMethod.GET)
@ApiOperation(value = "...",
              httpMethod = "GET",
              notes = "...",
              response = XCampaign.class,
              tags = { "Campaigns" })
@ApiResponses(value = { @ApiResponse(code = 200,
                                     message = "OK",
                                     response = XCampaign.class),
                        @ApiResponse(code = 401,
                                     message = "Unauthorized",
                                     response = HttpErrorResponse.class),
                        @ApiResponse(code = 400,
                                     message = "Bad Request",
                                     response = HttpErrorResponse.class),
                        @ApiResponse(code = 404,
                                     message = "Not Found",
                                     response = HttpErrorResponse.class),
                        @ApiResponse(code = 500,
                                     message = "Internal Server Error",
                                     response = HttpErrorResponse.class) })

基本上,我希望在Swagger中记录以下响应:

200:

{
    'campaign': {
        ...
    },
    links: {
        ...
    }
}

在4xx或5xx上:

{
    error: {
        ...
    }
}

我遇到的问题是“嵌套”组件。如果我将类本身列为Response类,则显然不会将其作为嵌套JSON返回。但是,如果我尝试嵌套它,如下所示:

public class HttpErrorResponse {

    private ErrorResponse error;

    private class ErrorResponse {
        public final String code;
        public final String message;

        public ErrorResponse(String code, String message) {
            this.code = code;
            this.message = message;
        }
    }
}

然后Swagger Docs显示一个空的Object:

HttpErrorResponse {}

我还看了一下Spring HATEOAS,并认为我将能够使用它实现2xx响应类型,如何通过嵌套类型实现我想要的一般性?

1 个答案:

答案 0 :(得分:0)

将这样的内容添加到Docket

.alternateTypeRules(
        newRule(typeResolver.resolve(DeferredResult.class,
                typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
            typeResolver.resolve(WildcardType.class)))

一般用DeferredResult<ResponseEntity<T>>代替T,有关更多信息,请参阅有关如何配置Swagger here的有用指南。

还导入所有必需的lib,包括一个很难理解的:

import static springfox.documentation.schema.AlternateTypeRules.*;