当前位置: 首页 > 知识库问答 >
问题:

带有路径变量和请求参数的Swagger codegen maven插件OpenApi生成不工作的代码

司徒隐水
2023-03-14

我正面临着一个昂首阔步的协成器生成存根的问题。我有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);
    }

有两个endpoint具有相同的URL,但参数不同。springwebframework就是这样工作的。接下来,我生成OpenApi json并获得2条路径:

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

然后,我试图用swagger codegen maven为该endpoint生成插件存根,然后我就面临了这个问题。

异常在线程"main"java.lang.IllegalArgumentExc0019:地图没有值'?登录

这种形式的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个答案

萧霍英
2023-03-14

在定义文件(.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

有关更多详细信息,请查看官方文档

 类似资料:
  • 我在Springdoc生成的OpenAPI规范中得到了验证错误,并且无法在网上找到与Java代码格式相匹配的示例。 我试图用Springdoc为Spring Boot控制器生成OpenAPI规范。我有一个具有多个路径变量的路径映射,方法签名接受一个命令对象(命令对象是由这些路径变量自动构造的)。swagger-ui.html似乎或多或少地起作用了,但是生成的JSON/YAML规范似乎并不有效。 为

  • 我的java bin文件夹包含java.exe @大卫华莱士 Microsoft Windows[版本6.3.9600](c)2013 Microsoft Corporation。保留所有权利。 C:\用户\Andy\AppData\漫游\Microsoft\Windows\开始菜单\Programs\Startup>

  • 我正在开发一个API,它允许使用URL进行搜索,比如: 这个答案几乎是我想要做的,我只是找不到一种方法来定义括号内的值为“任何字符串”,而不是已知名称的列表。

  • 我只是将代码从swagger代码生成器迁移到open api代码生成器。我通过maven插件使用生成器。我需要它为一个外部API(在我的控制之外)生成一个客户端,这里给出了使用的swagger文件。 我的插件设置如下: 为了有一个最小的例子,我把昂首阔步的来源去掉了: 当生成器运行正常时,代码无效 结果列表«GenericRow»完全错误。 另一方面,类的名称是正确生成的只有变量名称处理错误。 如

  • 我刚刚开始创建我的第一个OpenAPI定义(2.0版),我一直被这个错误所困扰: 无效的OpenAPI文件。请修复模式错误:\n\"/参数/分类Param\":域:验证;关键字:oneOf;消息:实例与一个模式不完全匹配;匹配:0" 它只是一个类似于“/cat/count”的查询,它将返回一个整数,即有多少猫-“cat”是所需的路径参数。我的参数定义到底有什么问题?

  • (我更喜欢)或 只需使用调用,值应存储在该请求的某个位置。 我知道可能更简单,因为它已经击中了正确的,但我更喜欢。 我刚刚意识到,不能像预期的那样工作,因为Spring Security总是首先处理请求。不过我需要一个拦截器在Spring安全启动之前处理它。