WebSphere Liberty 无法自动为 JAX-RS 生成 swagger api
WebSphere Liberty fails to automatically generate swagger for JAX-RS api
在我公司的多个项目中,我们使用 WebSphere Liberty Profile 和 apiDiscovery-1.0
功能来自动生成一个 swagger.json
来描述我们的 api.但是一个特定的项目失败了。
日志显示以下我认为与问题相关的堆栈跟踪(向右滚动以查看消息的内容):
[AUDIT ] CWWKT0016I: Aplicativo da Web disponível (default_host): http://d-00884081.domain.net:14099/mycontext/
[ERROR ] CWWKE0701E: [com.ibm.ws.rest.api.discovery.APIProviderAggregator(316)] The setApiProvider method has thrown an exception Bundle:com.ibm.ws.rest.api.discovery(id=120) java.util.ServiceConfigurationError: io.swagger.jaxrs.ext.SwaggerExtension: Provider io.swagger.jersey.SwaggerJersey2Jaxrs not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access0(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader.next(ServiceLoader.java:480)
at io.swagger.jaxrs.ext.SwaggerExtensions.<clinit>(SwaggerExtensions.java:31)
at [internal classes]
如果一切正常,我希望能够通过以下 URL 之一访问 swagger 文件:
- http://d-00884081.domain.net:14099/mycontext/swagger.json
- http://d-00884081.domain.net:14099/ibm/api/swagger.json
我不太明白错误消息以及我必须采取什么措施来修复它。
也许是关于使用 Jersey 作为 JAX-RS 实现。这里是项目中的依赖项 pom.xml
:
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-core</artifactId>
<version>1.5.16</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-jersey2-jaxrs</artifactId>
<version>1.5.16</version>
</dependency>
我试图将 jersey2 依赖项更改为
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-jaxrs</artifactId>
<version>1.5.13</version>
<scope>compile</scope>
</dependency>
但是现在代码无法编译,因为 class javax.ws.rs.core.Response
现在没有符号 readEntity
。看起来它使用的是旧的 api,只有符号 getEntity。我真的无法将代码更改为旧的 api,因为它被用在很多地方。
我使用应用程序 class 方法来激活 JAX-RS。这是它的简化版本:
@ApplicationPath("/api")
@SwaggerDefinition(
info=@Info(
version="1.4",
title="API REST",
description="a description",
),
schemes=SwaggerDefinition.Scheme.HTTP,
consumes={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON},
produces={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON},
)
public class JaxRsActivator extends Application {
@Inject private Logger log;
public JaxRsActivator() {
}
}
我应该如何修改配置以正确生成 swagger.json
文件?
您遇到的错误看起来像是 Liberty 提供的 Swagger 版本与您在应用程序中打包的 Swagger 版本之间的某种类加载冲突。
apiDiscovery-1.0
功能将为您的应用程序提供 Swagger 核心库和 io.swagger.annotations
包,因此无需在您的应用程序中也打包这些 Swagger jar。尝试将这些依赖项更改为 provided
范围。
旁注:我看到您出于某种原因将 swagger-jersey2-jaxrs
包括在内。这是因为您的应用程序使用 Jersey 作为第三方 JAX-RS 实现吗?如果启用 jaxrs-2.X
功能之一,Liberty 将自动提供 Apache CXF 作为 JAX-RS 运行时(您无需在应用程序中打包任何内容)。
在我公司的多个项目中,我们使用 WebSphere Liberty Profile 和 apiDiscovery-1.0
功能来自动生成一个 swagger.json
来描述我们的 api.但是一个特定的项目失败了。
日志显示以下我认为与问题相关的堆栈跟踪(向右滚动以查看消息的内容):
[AUDIT ] CWWKT0016I: Aplicativo da Web disponível (default_host): http://d-00884081.domain.net:14099/mycontext/
[ERROR ] CWWKE0701E: [com.ibm.ws.rest.api.discovery.APIProviderAggregator(316)] The setApiProvider method has thrown an exception Bundle:com.ibm.ws.rest.api.discovery(id=120) java.util.ServiceConfigurationError: io.swagger.jaxrs.ext.SwaggerExtension: Provider io.swagger.jersey.SwaggerJersey2Jaxrs not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access0(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader.next(ServiceLoader.java:480)
at io.swagger.jaxrs.ext.SwaggerExtensions.<clinit>(SwaggerExtensions.java:31)
at [internal classes]
如果一切正常,我希望能够通过以下 URL 之一访问 swagger 文件:
- http://d-00884081.domain.net:14099/mycontext/swagger.json
- http://d-00884081.domain.net:14099/ibm/api/swagger.json
我不太明白错误消息以及我必须采取什么措施来修复它。
也许是关于使用 Jersey 作为 JAX-RS 实现。这里是项目中的依赖项 pom.xml
:
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-core</artifactId>
<version>1.5.16</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-jersey2-jaxrs</artifactId>
<version>1.5.16</version>
</dependency>
我试图将 jersey2 依赖项更改为
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-jaxrs</artifactId>
<version>1.5.13</version>
<scope>compile</scope>
</dependency>
但是现在代码无法编译,因为 class javax.ws.rs.core.Response
现在没有符号 readEntity
。看起来它使用的是旧的 api,只有符号 getEntity。我真的无法将代码更改为旧的 api,因为它被用在很多地方。
我使用应用程序 class 方法来激活 JAX-RS。这是它的简化版本:
@ApplicationPath("/api")
@SwaggerDefinition(
info=@Info(
version="1.4",
title="API REST",
description="a description",
),
schemes=SwaggerDefinition.Scheme.HTTP,
consumes={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON},
produces={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON},
)
public class JaxRsActivator extends Application {
@Inject private Logger log;
public JaxRsActivator() {
}
}
我应该如何修改配置以正确生成 swagger.json
文件?
您遇到的错误看起来像是 Liberty 提供的 Swagger 版本与您在应用程序中打包的 Swagger 版本之间的某种类加载冲突。
apiDiscovery-1.0
功能将为您的应用程序提供 Swagger 核心库和 io.swagger.annotations
包,因此无需在您的应用程序中也打包这些 Swagger jar。尝试将这些依赖项更改为 provided
范围。
旁注:我看到您出于某种原因将 swagger-jersey2-jaxrs
包括在内。这是因为您的应用程序使用 Jersey 作为第三方 JAX-RS 实现吗?如果启用 jaxrs-2.X
功能之一,Liberty 将自动提供 Apache CXF 作为 JAX-RS 运行时(您无需在应用程序中打包任何内容)。