首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Springfox不为Springfox版本API生成Swagger文档

Springfox不为Springfox版本API生成Swagger文档
EN

Stack Overflow用户
提问于 2015-09-10 12:34:12
回答 1查看 1.6K关注 0票数 1

我们面临REST版本控制,在阅读了大量关于不同选项(URI版本控制、mime类型版本控制)之后,决定使用后一种方法。

我原以为Springfox会生成以下文档:

v1:

代码语言:javascript
复制
get /api/architecture/mails - application/vnd.arch.mails.v1+json 
get /api/architecture/services - application/vnd.arch.service.v1+json

v2:

代码语言:javascript
复制
get /api/architecture/services - application/vnd.arch.service.v2+json

但是,在v2中,我也得到了以下内容:

代码语言:javascript
复制
get /api/architecture/services - application/vnd.arch.service.v1+json

它不应该存在,因为我将v2 Docklet配置为.produces(new HashSet<String>(Arrays.asList(new String[]{"application/vnd.arch.service.v2+json"}))),以便它根据版本化的mime类型过滤服务。为什么不工作?

这是我们的springfox配置

代码语言:javascript
复制
    @Bean
    public Docket arqV1Api() {
        return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.regex("/api/architecture/.*"))               
            .build()
            .apiInfo(new ApiInfo("Architecture Rest Api","Architecture REST Services","v1","","","",""))
            .produces(new HashSet<String>(Arrays.asList(new String[]{"application/vnd.arch.service.v1+json","application/vnd.arch.mail.v1+json"})))
            .securitySchemes(newArrayList(apiKey()))
            .securityContexts(newArrayList(securityContext()))
            .groupName("Arq v1 group");
    }


    @Bean
    public Docket arqV2Api() {
        return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.regex("/api/architecture/.*"))               
            .build()
            .apiInfo(new ApiInfo("Architecture Rest Api","Architecture REST Services","v2","","","",""))
            .produces(new HashSet<String>(Arrays.asList(new String[]{"application/vnd.arch.service.v2+json"})))
            .securitySchemes(newArrayList(apiKey()))
            .securityContexts(newArrayList(securityContext()))
            .groupName("Arq v2 group");
    }

这些是REST控制器

代码语言:javascript
复制
private static final String serviceArqV1MediaType = "application/vnd.arch.service.v1+json";
private static final String serviceArqV2MediaType = "application/vnd.arch.service.v2+json";
private static final String mailsArqV1MediaType   = "application/vnd.arch.mail.v1+json";

@ApiOperation(value = "Gets architecture services", 
              notes = "",
              produces = serviceArqV1MediaType)
@ApiResponses(value = {
        @ApiResponse(code = 200, message = "Request OK"),
        @ApiResponse(code = 400, message = "Bad Request")})
@RequestMapping(value = {"/services"}, method = RequestMethod.GET, 
                produces = serviceArqV1MediaType)
public List<ServicioArquitectura> getServices() {
    return Arrays.asList(new ServiceArch[]{new ServicioArquitectura("Support"), new ServicioArquitectura("Kickoff")});
}

@ApiOperation(value = "Gets architecture services", 
          notes = "",
          produces = serviceArqV2MediaType)
@ApiResponses(value = {
      @ApiResponse(code = 200, message = "Request OK"),
      @ApiResponse(code = 400, message = "Bad Request")})
@RequestMapping(value = {"/services"}, method = RequestMethod.GET, 
                produces = {serviceArqV2MediaType})
public List<ServicioArquitecturaV2> getServicesV2() {
    return Arrays.asList(new ServiceArchV2[]{new ServiceArchV2("Support", Boolean.TRUE), new ServiceArchV2("Kickoff", Boolean.FALSE)});
}

@ApiOperation(value = "Gets mails", 
          produces = mailsArqV1MediaType)
@ApiResponses(value = {
      @ApiResponse(code = 200, message = "Request OK"),
      @ApiResponse(code = 400, message = "Bad Request")})
@RequestMapping(value = {"/mails"}, method = RequestMethod.GET, 
                produces = {mailsArqV1MediaType})
public List<String> getMails() {
    return Arrays.asList(new String[]{"xxxcompany.com"});
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-11 07:39:55

我在Springfox的github中打开了一个问题,他们指出了如何正确配置它。以下是解决办法:

辅助静态方法

代码语言:javascript
复制
 public static Predicate<RequestHandler> withMediaType(final MediaType[] mediaTypes){
    return new Predicate<RequestHandler>() {
        @Override
        public boolean apply(RequestHandler input) {
            if(mediaTypes!=null){
                ProducesRequestCondition producesCondition = input.getRequestMapping().getProducesCondition();
                Set<MediaType> producibleMediaTypes = producesCondition.getProducibleMediaTypes();
                for (MediaType mt : producibleMediaTypes) {
                    for (int i = 0; i < mediaTypes.length; i++) {
                        if(mt.equals(mediaTypes[i])){
                            return true;
                        }
                    }
                }
            }
            return false;
        }
    };
}

public static Set<String> mediaTypesToStringSet(MediaType[] mediaTypes){
    Set<String> mediaTypesSet = new HashSet<String>();
    if(mediaTypes!=null){
        for (int i = 0; i < mediaTypes.length; i++) {
            mediaTypesSet.add(mediaTypes[i].toString());
        }
    }
    return mediaTypesSet;
}

文档定义:

代码语言:javascript
复制
@Bean
public Docket arqV1Api() {
    MediaType[] validMediaTypes = new MediaType[]{new MediaType("application","vnd.arch.service.v1+json"),
                                                  new MediaType("application","vnd.arch.mails.v1+json")};
    return new Docket(DocumentationType.SWAGGER_2)
        .select()
        .apis(withMediaType(validMediaTypes))
        .paths(PathSelectors.regex("/api/architecture/.*"))               
        .build()
        .apiInfo(new ApiInfo("Architecture Rest Api","Architecture REST Services","v1","","","",""))
        .produces(mediaTypesToStringSet(validMediaTypes))
        .securitySchemes(newArrayList(apiKey()))
        .securityContexts(newArrayList(securityContext()))
        .groupName("Arq v1 group");
}
@Bean
public Docket arqV2Api() {
    MediaType[] validMediaTypes = new MediaType[]{new MediaType("application","vnd.arch.service.v2+json")};
    return new Docket(DocumentationType.SWAGGER_2)
        .select()
        .apis(withMediaType(validMediaTypes))
        .paths(PathSelectors.regex("/api/architecture/.*"))               
        .build()
        .apiInfo(new ApiInfo("Architecture Rest Api","Architecture REST Services","v2","","","",""))
        .produces(mediaTypesToStringSet(validMediaTypes))
        .securitySchemes(newArrayList(apiKey()))
        .securityContexts(newArrayList(securityContext()))
        .groupName("Arq v2 group");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32502054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档