如何将多控制器的包基础设置为我的 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
我不能做的事情
- 我无法更改包基础,因为它们很大 APIs。
- 我有超过 10 个 API 跟在 2 个包基础之后。
- 我想使用
aPackageBase
和 bPackageBase
。
当前代码无效...
...
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 更改它。如果我可以拥有 aPackageBase
和 bPackageBase
,它会救我一命。哈哈
注意:我认为我不需要更多地展示我的 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))
....
我的依赖....
<!-- 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
我不能做的事情
- 我无法更改包基础,因为它们很大 APIs。
- 我有超过 10 个 API 跟在 2 个包基础之后。
- 我想使用
aPackageBase
和bPackageBase
。
当前代码无效...
...
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 更改它。如果我可以拥有 aPackageBase
和 bPackageBase
,它会救我一命。哈哈
注意:我认为我不需要更多地展示我的 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
.
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))
....