java - 如何安排Docket的groupName在Swagger UI中显示的顺序

标签 java spring-boot swagger-ui swagger-2.0 springfox

我在一个 Spring Boot 应用程序中设置两个不同的 Docket API。 我给了一个 Docket“Test”groupName 并保留了另一个,因此它最终在 Swagger UI 中成为“默认”。

我的问题是,如何在 UI 中排列这些 Dockets 的顺序。

一开始我以为是按字母顺序排列的,但事实并非如此。我不断地改变名字,但顺序未知。

    @Bean
    public Docket myAPI(){
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("anything"))
            .paths(PathSelectors.regex("/v1/anything.*"))
            .build()
            .apiInfo(apiInfo());
        buildGlobalParameter(docket);
        buildGlobalResponseMessage(docket);
        return docket;
    }

    @Bean
    public Docket testAPI(){
        Docket tDocket = new Docket(DocumentationType.SWAGGER_2)
            .groupName("Test Card")
            .select()
            .apis(RequestHandlerSelectors.basePackage("anything"))
            .paths(PathSelectors.regex("/v1/anything2*"))
            .build()
            .apiInfo(apiTestInfo());
        buildGlobalParameter(tDocket);
        buildGlobalResponseMessage(tDocket);
        return tDocket;
    }

https://i.imgur.com/bMiGkXe.jpg

抱歉,我还不能发布图片,所以我留下直接的 URL。

当我运行 Spring Boot 应用程序时,我希望默认的 Swagger UI 显示为“默认”UI。

最佳答案

摘要确实是按字母顺序排序的 - 您的示例中的摘要也是如此。如果摘要的组名称为“Test”和“default”,则摘要也会按此顺序显示在 Swagger UI 页面上。如果您明确命名的摘要的名称是“test”(而不是“Test”或“Test Card”),那么它们将按照您的预期显示。

这种行为的原因是默认情况下使用区分大小写的 String.compareTo(String) 方法来比较字符串 - 考虑到这一点,因为示例中的摘要名称的第一个字符是名称为“Test”的“T”和“d”确实应该出现在名称“default”之前,因为它们的 Unicode 值分别是 84 和 100。

另一方面,不幸的是,您问题的答案是否定的 - 特别是如果您使用的是 Swagger2 或更旧版本。有proposal/pull-request用于删除摘要排序,并且该更改将包含在 Swagger3 中(根据 Springfox 当前主要贡献者对共享拉取请求的响应)。现在,您有 3 个肮脏的选项来实现按所需顺序显示摘要:

  • 添加相应的数字作为每个摘要组名称的前缀 - 使用此方法,您还应该为默认摘要定义显式名称,因此其名称可能类似于“1 default”,其他摘要的名称将为“2 Test” ”。如果您的摘要数超过 9 个,请记住添加前导零,以防紧接在前缀/数字之后的字符的 Unicode 值高于 58(对于此示例中的空格来说,没有必要,因为其值是32)
  • 添加相应数量的空格作为每个摘要组名称的前缀(数量越高,位置越靠后) - 这实际上是一个很好的解决方法,因为前导空格可以按照所需的顺序对摘要进行排序,但它们会在显示之前被修剪,这样 Swagger UI 上的下拉菜单就不会看起来很奇怪。如果您有很多摘要,并且在每个组名称的字符串文字中手动插入特定数量的空格很麻烦,您可以使用 here 中的一些字符重复解决方案。
  • 如果您迫不及待地使用 Swagger3,并且以前的选项看起来太脏或对您来说只是部分解决方法,您可以从 Swagger2 中提取一些组件类并相应地调整它们,这样下拉列表中就不会显示摘要菜单按字母顺序排序,但与使用 @Bean 注释定义/注入(inject)的顺序相同。关于前面提到的pull-request在其评论中您可以找到需要进行哪些细微更改。除了将提到的 2 个类导出到您的项目之外,您还必须使用非公共(public)访问修饰符提取相应的已使用类。注意:如果你一切都做对了,你最终应该得到 5 门课。另外,不要忘记使用 @Primary 注释来注释提取和自定义的 @Component 类!

关于java - 如何安排Docket的groupName在Swagger UI中显示的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57033353/

相关文章:

java - 尝试使用命令行远程编译一个具有多个依赖项的 Java 程序,目前我只能在 Eclipse 中进行本地编译

java - 为可过滤和可编辑的 jComboBox 项目设置工具提示

不同类中的 Java ActionEvent

java - java 中单实例类的最佳实践是什么?

spring-boot - 在哪种情况下,kubernetes pod可以停止工作?

java - 在同一上下文中使用 Spring Boot 2 OAuth 客户端和资源服务器

spring - 在 gradle 测试命令行中使用 -Dspring.config.name 和 -Dspring.config.location

asp.net-core - ASP.NET Core 在启动时解析 url?

java - Swagger UI 不显示所有 header 值

javascript - 带有客户端凭证流的 Swashbuckle OAuth2 授权