如何将多控制器的包基础设置为我的 SwaggerConfiguration?

How to set multi controller's package base to my SwaggerConfiguration?

我的依赖....

<!-- SPRING BOOT -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>


我的问题发生在我试图在 swagger 中使用两个包基础时。在下面你可以看到我对 package base 的意思,在上面你可以看到我的依赖。我尝试使用两个包基础的代码在下面。

aPackageBase: com.companyx
bPackageBase: br.com.companyz

我不能做的事情


当前代码无效...

...
String aPackageBase = "com.companyx";
String bPackageBase = "br.com.companyz";

Docket docket = new Docket(DocumentationType.OAS_30).select() //
    .apis(RequestHandlerSelectors.basePackage(aPackageBase) //
        .and(RequestHandlerSelectors.basePackage(bPackageBase))) // That doesn't work :(....
        .paths(PathSelectors.any()).build()

...

想要什么...

我只想使用两个基础包。我不是要在运行时更改它,当然我可以在运行时更改它并仅使用 one packageBase,但我厌倦了为每个 API 更改它。如果我可以拥有 aPackageBasebPackageBase,它会救我一命。哈哈


注意:我认为我不需要更多地展示我的 SwaggerConfiguration,因为我的问题仅在于那部分。

您需要稍微更改一下 Docket bean 定义。

Docket docket = new Docket(DocumentationType.OAS_30)
    .select() //
    .apis(RequestHandlerSelectors.basePackage(aPackageBase) //
        .or(RequestHandlerSelectors.basePackage(bPackageBase))) // use or here, not and
    .paths(PathSelectors.any())
    .build();

RequestHandlerSelectors.basePackage(...) returns 一个 java.util.function.Predicate 对象。

Predicate#and 要求两个条件都为真,但事实并非如此,因为任何 API 都将只存在于其中一个包中。因此 Predicate#or.

is the right one. But if you are using an older version of springfox, the basePackage returns a Google Guava predicate (link).

请注意,Google Guava 谓词扩展了 Java 谓词,并且 or 方法未在 Guava 谓词中被覆盖。因此,调用 or 将 return 一个 Java 谓词。您可以使用方法引用(或 lambda 表达式)将 Guava 谓词传递给 apis 方法。

//A java.util.function.Predicate
Predicate<RequestHandler> predicate = RequestHandlerSelectors.basePackage(aPackageBase)
          .or(RequestHandlerSelectors.basePackage(bPackageBase));

return docket.select()
           .apis(predicate::test) //.apis(r -> p1.test(r))
           ....