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

How to arrange the order of Docket's groupName displayed in Swagger UI

我在一个 spring 启动应用程序中设置了两个不同的 Docket API。 我给了一个 Docket "Test" groupName 并保留了另一个,所以它在 Swagger UI.

中最终变成了 "default"

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

起初我以为是按字母顺序排列的,其实不是。我不断更改名称,但顺序未知。

    @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

对不起,我还不能post图片,所以我直接离开URL。

当我 运行 spring 启动应用程序时,我希望默认的 Swagger UI 显示为 "default"。

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

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

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

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