Неправильный URL-адрес службы в swagger-ui с использованием JAX-RS и swagger-core

#java #jersey #swagger #jax-rs #swagger-ui

#java #джерси #swagger #jax-rs #swagger-ui

Вопрос:

Мне нужно использовать openapi 3 с swagger ui для документирования службы jaxrs jersey, используя swagger-core v3. Я предпочитаю использовать полный кодовый подход без использования файлов конфигурации. Я собираюсь использовать Wildfly для развертывания службы.

Вот код для генерации openapi.json по следующему адресу: http://localhost:12079/suma-auth-ms/rest/openapi.json

 @ApplicationPath("/rest")
public class AuthRestConfig extends Application {

  public AuthRestConfig(@Context ServletConfig servletConfig) {
    super();

    System.out.println();
    OpenAPI oas = new OpenAPI();
    Info info = new Info()
        .title("Suma Automaton OpenAPI")
        .description("This is a sample server Petstore server.  You can find out more about Swagger "
              "at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/).  For this sample, "
              "you can use the api key `special-key` to test the authorization filters.")
        .termsOfService("http://swagger.io/terms/")
        .contact(new Contact()
            .email("emasil@email.com"));

    oas.info(info);
    SwaggerConfiguration oasConfig = new SwaggerConfiguration()
        .openAPI(oas)
        .prettyPrint(true)
        .resourcePackages(Stream.of("io.swagger.sample.resource").collect(Collectors.toSet()));

    try {
      new JaxrsOpenApiContextBuilder<>()
          .servletConfig(servletConfig)
          .application(this)
          .openApiConfiguration(oasConfig)
          .buildContext(true);
    } catch (OpenApiConfigurationException e) {
      throw new RuntimeException(e.getMessage(), e);
    }

  }
}
  

и здесь вы можете увидеть файл openapi.json по указанному адресу:

 {
    "openapi": "3.0.1",
    "paths": {
        "/rest/authentication/authenticateUser": {
            "post": {
                "operationId": "authenticateUser",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Credentials"
                            }
                        }
                    }
                },
                "responses": {
                    "default": {
                        "description": "default response",
                        "content": {
                            "application/json": {}
                        }
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Credentials": {
                "type": "object",
                "properties": {
                    "username": {
                        "type": "string"
                    },
                    "password": {
                        "type": "string"
                    }
                }
            }
        }
    }
}
  

Как вы можете видеть в этом файле, нет ссылок на suma-auth-ms, служба правильно отвечает на http://localhost:12079/suma-auth-ms/rest/authentication/authenticateUser

Когда я собираюсь взглянуть на пользовательский интерфейс swagger и попытаться выполнить некоторые тесты, я получаю такой результат: введите описание изображения здесь

Показанная ошибка связана с отсутствием suma-auth-ms в адресе, используемом curl для вызова службы. Адрес должен быть http://localhost:12079/suma-auth-ms/rest/authentication/authenticateUser и не http://localhost:12079/rest/authentication/authenticateUser

Есть ли способ исправить?

Ответ №1:

Вам нужно использовать io.swagger.v3.oas.models.servers.Сервер и добавьте его в свой объект oas.

 oas.info(info);
String url = "/suma-auth-ms/"
List<Server> servers = new ArrayList<Server>();
Server server = new Server();
server.setUrl(url);
servers.add(server);
oas.setServers(servers)
  

После внесения этого изменения вы должны увидеть серверы, перечисленные в вашем openapi.json, и вы сможете выполнить запрос с добавлением suma-auth-ms

Комментарии:

1. Спасибо за ответ. swagger-core, похоже, игнорирует мои конфигурации. Использование конфигурации previus, добавление вашей конфигурации или использование пустого приложения: @ApplicationPath("/rest") public class AuthRestConfig extends Application { public AuthRestConfig() { } } дайте мне тот же результат. Есть идеи?

2. Возможно, есть одно отличие, которое вы можете try…..In в моем случае я использовал пользовательский класс сервлета для настройки Swagger и создал отдельный класс для конфигурации JAX-RS, который работает нормально.

3. Привет, ты нашел решение для этого?