带有路径变量和请求参数的 Swagger codegen maven 插件 OpenApi 生成无效代码
Swagger codegen maven plugin with path variables and request params OpenApi produces not working code
我遇到了 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 框架适用于此。
接下来,我生成 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 中缺少登录映射键值而引发异常。
你应该小心你的定义文件(.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
有关更详细的信息,请查看 official docuementation
我遇到了 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 框架适用于此。 接下来,我生成 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 中缺少登录映射键值而引发异常。
你应该小心你的定义文件(.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
有关更详细的信息,请查看 official docuementation