WebSphere Liberty не может автоматически сгенерировать сваггер для API JAX-RS - PullRequest
1 голос
/ 02 апреля 2019

В нескольких проектах моей компании мы используем 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.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:

Я не совсем понимаю сообщение об ошибке и что я должен сделать, чтобы исправить это.

Может быть, дело в использовании Джерси в качестве реализации 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. Похоже, что он использует старый API, который просто имеет символ getEntity. Я не могу изменить код на старый 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?

1 Ответ

2 голосов
/ 02 апреля 2019

Ошибка, с которой вы сталкиваетесь, выглядит как своего рода конфликт загрузки классов между версией Swagger, которую предоставляет Liberty, и версией Swagger, которую вы упаковываете внутри своего приложения.

Функция apiDiscovery-1.0 обеспечитОсновные библиотеки Swagger и пакет io.swagger.annotations для вашего приложения, поэтому нет необходимости также упаковывать эти файлы Swagger в ваше приложение.Попробуйте изменить эти зависимости на provided scope.

Примечание: я вижу, что вы включаете swagger-jersey2-jaxrs по некоторым причинам.Это потому, что ваше приложение использует Jersey в качестве сторонней реализации JAX-RS?Если вы включите одну из функций jaxrs-2.X, Liberty автоматически предоставит Apache CXF в качестве среды выполнения JAX-RS (вам не нужно ничего упаковывать в своем приложении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...