Плагин Swagger Codegen Maven с переменными пути и параметрами запроса OpenApi создает не работающий код - PullRequest
0 голосов
/ 09 января 2020

У меня проблема с генерируемыми заглушками, генерируемыми сваггером. У меня есть 2 услуги. Сначала предоставляется REST api с двумя методами с путем var и параметром запроса:

    @GetMapping(value = "/start/{pathVar}/operators", params = "login")
    public Operator getOperatorByLogin(
                @ApiParam @PathVariable Long pathVar, 
                @ApiParam(required = true) @RequestParam  String login) {
        return operatorRepository.findDistinctByLogin(login);
    }

и

    @GetMapping(value = "/start/{pathVar}/operators", params = "ids")
    public List<Operator> getOperatorsByIds(
                @ApiParam @PathVariable Long pathVar, 
                @ApiParam( allowMultiple = true) @RequestParam List<Long> ids) {
        return operatorRepository.findAllByOperatorIdIn(ids);
    }

Существуют 2 конечные точки с одинаковыми URL-адресами, но с разными параметрами. Spring-Web Framework работает с этим. Затем я генерирую OpenApi json и получаю 2 пути:

"/start/{pathVar}/operators{?ids}": ...
"/start/{pathVar}/operators{?login}": ...

Затем я пытаюсь сгенерировать с помощью заглушек swagger-codegen-maven-plugin для этих конечных точек, а затем я сталкиваюсь с проблемой.

Исключение в потоке "main" java .lang.IllegalArgumentException: Карта не имеет значения для '? Login'

URL-адреса в этой форме жестко закодированы в сгенерированных классах.

(...)
final Map<String, Object> uriVariables = new HashMap<String, Object>();
uriVariables.put("pathVar", pathVar);
String path = UriComponentsBuilder.fromPath(
"/start/{pathVar}/opeartors{?login}").buildAndExpand(uriVariables).toUriString();
(...)

выдает исключение из-за отсутствия значения ключа карты входа в uriVariables.

1 Ответ

1 голос
/ 09 января 2020

Вы должны быть осторожны в своем файле определения (. json или .yml), чтобы определить правильный тип для ваших параметров, так как есть два вида параметров:

  1. Параметр пути (GET / users / {id})
  2. Параметр запроса (GET / user / findByLogin? name = myUserLogin)

Эти два имеют объявление двух разностей в OpenAPI

1) Параметр пути

paths:
  /users/{id}:
    get:
      parameters:
        - in: path
          name: id   # Note the name is the same as in the path
          required: true
          schema:
            type: integer
            minimum: 1
          description: The user ID

2) Параметр запроса

parameters:
    - in: query
      name: myUserLogin
      schema:
        type: integer
        description: The number of items to skip before starting to collect the result set

Для более подробной проверки официальная документация

...