【问题标题】:WebSphere Liberty fails to automatically generate swagger for JAX-RS apiWebSphere Liberty 无法为 JAX-RS api 自动生成 swagger
【发布时间】:2019-04-02 16:35:24
【问题描述】:

在我公司的多个项目中,我们使用 WebSphere Liberty ProfileapiDiscovery-1.0 功能来自动生成描述我们 API 的 swagger.json。但是一个特定的项目失败了。

日志显示以下我认为与问题有关的堆栈跟踪(向右滚动查看消息内容):

[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.access$300(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$1.next(ServiceLoader.java:480)
    at io.swagger.jaxrs.ext.SwaggerExtensions.<clinit>(SwaggerExtensions.java:31)
    at [internal classes]

如果一切正常,我希望能够通过以下 URL 之一访问 swagger 文件:

我真的不明白错误消息以及我必须做些什么来修复它。

也许这与使用 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>

但现在代码无法编译,因为类 javax.ws.rs.core.Response 现在没有符号 readEntity。看起来它正在使用一个只有符号 getEntity 的旧 api。我真的无法将代码更改为旧 api,因为它在很多地方使用。

我使用应用程序类方法来激活 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 文件?

【问题讨论】:

    标签: jakarta-ee swagger websphere-liberty jax-rpc


    【解决方案1】:

    您遇到的错误看起来像是 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 运行时(您无需在应用程序中打包任何内容)。

    【讨论】:

    • 我们正在使用jaxrs-2.0 功能。问题是没有 Jersey,代码无法编译,因为类 javax.ws.rs.core.Response 现在没有符号 readEntity。我不需要使用 Jersey,只需一个具有相同 api 的实现。
    • javax.ws.rs.core.Response 类来自官方的 JAX-RS API,而不是专门针对 Jersey(尽管 Jersey 会将其作为传递依赖项包含在内)。无需拉入 Jersey,只需将 API 作为provided 范围依赖项拉入:mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api/2.0.1。或者更一般地说,将所有 Java EE 7 API 作为提供的范围依赖项引入。
    • swagger-jaxrs 依赖于 Jersey 1.x,所以它绝对不是你想要的。 apiDiscovery-1.0 功能为您提供了所需的运行时 jar,因此最好将 Swagger 放在 provided 范围内。
    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 2015-08-06
    • 2013-02-27
    • 2017-05-21
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多