4

前几天我在 JavaEE 7 中启动了一个 REST API,我用三个方法实现了一个类,并在项目中成功实现了 Swagger 和 Swagger-UI,它显示了我在生成的 JSON 中成功实现的三个端点。

但是,我迁移到 JavaEE 8,在此更改之后,Swagger 检测到几个未知端点,例如“默认”端点(此捕获仅显示了所有端点的一部分):

一些端点

调查了一下,我发现这些端点可能属于 Eclipselink 实现中的 JPA REST API,如此处所述https://oracle-base.com/articles/misc/oracle-rest-data-services-ords-open-api- swagger-support和这里https://www.eclipse.org/eclipselink/documentation/2.4/solutions/restful_jpa004.htm#CHDFCFFA 尽管它们出现在生成的 JSON 中,但它们都包含可变路径,所以我无法访问它们遵循 Swagger 给出的路径,甚至使用上述示例的网络发明了一些参数,例如“版本”。

我使用的 Swagger 版本是 v3,也就是 OpenAPI 版本。我在端点类中指定 OpenAPI 属性@OpenAPIDefinition,它还包含一个@Tag注释来对它们进行分组,三个方法包含@Operation带有它们自己的标签@ApiResponse。我不再编写 Swagger/OpenAPI 注释/文件/类。

问题是,我怎样才能让 Swagger 忽略这些端点?谢谢

4

1 回答 1

3

最后我找到了解决方案。案例是 Swagger 扫描引擎扫描整个项目,忽略类和他的方法是否有 @Operation。如果我的假设是真的,一些 Eclipselink 类可能有 Swagger 注释(我不确定),所以当 Swagger 扫描时,如果找到它们并将它们添加到 JSON/YAML。解决方案是创建/添加到现有的 openapi.yaml (它可以有多个名称并且可以在多个位置,如此处列举:https ://github.com/swagger-api/swagger-core/wiki/Swagger-2 .X---集成和配置#known-locations)这个:

resourceClasses:
- com.path.to.your.package.Resource
prettyPrint: true
cacheTTL: 0 
scannerClass: io.swagger.v3.jaxrs2.integration.JaxrsAnnotationScanner
readAllResources: false

代替resourceClasses它可以写resourcePackages,然后它应该以与用于指定包相同的样式指定整个包和类。老实说,这个属性对我的问题没有影响。解决方案是设置readAllResourcesfalse。原因就在这里,在注释中:https ://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Annotations#operation

Blockquote 注意:默认情况下,swagger-jaxrs2 阅读器引擎还包括未使用 @Operation 注释的已扫描资源的方法,只要在类和/或方法级别定义了 jax-rs @Path 以及 http 方法注释( @GET、@POST 等)。

我希望这个解决方案适用于任何人,如果他/她必须面对同样的问题。

于 2019-10-25T11:53:04.500 回答