Плагин Swagger codegen maven с переменными пути и параметрами запроса OpenApi создает неработающий код
Я столкнулся с проблемой с генерируемыми заглушками swagger codegen. У меня 2 услуги. Сначала предоставляет REST api двумя методами с параметром пути и параметром запроса:
@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 ответ
Вы должны быть осторожны с вашим файлом определения (.json или.yml), чтобы определить правильный тип для ваших параметров, поскольку есть два типа параметров:
- Параметр пути (GET /users/{id})
- Параметр запроса (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
Более подробную информацию можно найти в официальной документации.