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

Swagger 1.5未生成有效的JSON描述

岑彬炳
2023-03-14

我正在尝试大摇大摆地记录我的 API,该 API 由泽西Spring 2.22.2 与Spring 4.3 和杰克逊 2.22.2 组成。

我使用的swagger软件包是:

<dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-jersey2-jaxrs</artifactId>                        
            <scope>compile</scope>
            <version>1.5.12</version>
</dependency>

endpoint声明之一:

    @POST
    @ApiOperation(
            value = "creates folder hierarchy type client|lead",
            notes = "creates folder hierarchy type client|lead"
    )
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "creation successfull")
    })
    @Path("create_type")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response createHierarchy(
            @ApiParam(value = "hierarchy type", required = true) @NotNull @FormDataParam("type") EHierarchyType hierarchyType,
            @ApiParam(value = "parametric part of the hierarchy", required = true) @NotNull @FormDataParam("params") Map<String, Folder2> folderMap
    ) throws ItemExistsException, AccessDeniedException, PathNotFoundException, WebserviceException, RepositoryException, DatabaseException, ExtensionException, AutomationException, UnknowException, IOException, UserQuotaExceededException, LockException, VersionException {
        StopWatch stopWatch = new StopWatch();

        folderCtrl.createHierarchy(folderMap, hierarchyType);
        logger.info("create hierarchy took: " + stopWatch.getElapsedTime());

        return Response.ok().build();
    }

这就是此endpoint生成的 JSON 的样子:

"/folder/create_type" : {
      "post" : {
        "tags" : [ "folder" ],
        "summary" : "creates folder hierarchy type client|lead",
        "description" : "creates folder hierarchy type client|lead",
        "operationId" : "createHierarchy",
        "consumes" : [ "multipart/form-data" ],
        "parameters" : [ {
          "name" : "type",
          "in" : "formData",
          "description" : "hierarchy type",
          "required" : true,
          "type" : "string",
          "enum" : [ "CLIENT", "LEAD" ]
        }, {
          "name" : "params",
          "in" : "formData",
          "description" : "parametric part of the hierarchy",
          "required" : true,
          "type" : "object"
        } ],
        "responses" : {
          "200" : {
            "description" : "creation successfull"
          }
        }
      }
    }

当我试图在swagger编辑器中解析这个输出时,它会返回错误,我认为原因可能是在“paramas”name参数中,它创建了它的对象类型而不是模式。我的重点是找出原因?是大摇大摆的小虫还是我错过了什么?

此外,在我的另一个endpoint上,有@FormDataParam,它是一个用@ApiModel注释的pojo模型对象。这被swagger翻译为“ref”类型,但它没有给用户任何其他线索来说明这个对象是什么或者它应该包含哪些字段。在Swagger-UI中,我只看到“未定义”作为参数类型。这没有太多信息。我需要做什么才能看到对象的结构,并提供它的json定义作为示例在用户界面中尝试?谢谢

共有1个答案

楚翰
2023-03-14

这个答案包含最终Swagger规范应该是什么样子的示例,但是我不知道如何使用Swagger@注释来表达它。希望这能给你一些想法。

在Swagger 2.0中,没有直接的方法在请求体中包含文件对象——表单参数可以是原始值、数组和文件,但不是对象,而体参数支持对象,但不是文件(尽管您可以尝试将文件表示为< code > type:string ——下面将详细介绍)。

下一个版本OpenAPI规范3.0(在编写本文时是RC)将支持包含文件对象的请求正文——请查看此示例。我想@annotations也会更新以支持这一点。

现在你有几个选择。

1)一种可能的方法是将文件内容作为正文参数的一部分作为二进制字符串传递。您的API规范如下所示:

paths:
  /something:
    post:
      consumes:
        - application/json
      parameters:
        - in: body
          name: body
          required: true
          schema:
            $ref: '#/definitions/FileWithMetadata'
      ...

definitions:
  FileWithMetadata:
    type: object
    required: [file_data]
    properties:
      file_data:
        type: string
        format: binary  # or format: byte
      metadata:
        type: object
        additionalProperties:
          type: string

2) 另一种可能的方法是将元数据名称和值作为单独的数组发送,这样您将有3个表单参数:文件、键名数组和键值数组。这类似于:

curl -F "file=@foo.zip" -F "metadata_keys=description,author" -F "metadata_values=A ZIP file,Helen" https://api.example.com

您的API规范如下所示:

paths:
  /something:
    post:
      consumes:
        - multipart/form-data
      parameters:
        - in: formData
          name: file
          type: file
          required: true
        - in: formData
          name: metadata_keys
          type: array
          items:
            type: string
        - in: formData
          name: metadata_values
          type: array
          items:
            type: string
 类似资料:
  • 我如何建立一个方程来产生扫频正弦波。我是信号处理新手,在网上找不到太多关于生成扫描正弦波的话题。请告诉我一些我可以用来生成方程式并在代码中使用的源代码。非常感谢。

  • 在Effective Java(第二版)的第2项中,作者提到了以下关于在使用构建器时对参数施加不变量的内容: 在将参数从构建器复制到对象后,必须检查它们,并在对象字段而不是构建器字段上检查它们(项目 39)。如果违反任何不变量,则生成方法应引发非法状态异常(项 60)。 这是否意味着构建方法创建目标对象后,应该将其传递给验证例程以进行任何所需的验证? 另外,有人能解释一下这背后的原因吗?

  • 问题内容: 我正在尝试从Web服务器读取.json文件。 我从服务器接收到的JSON在http://jsonlint.com/上报告无效: 它显示以下测试结果: 在使用PHP解析之前,如何将其转换为VALID JSON? 问题答案: 所有键(preOpen,preClose等)都必须是字符串,因此它们需要用双引号引起来。 ===更新=== 如果您的Json-String无效,则可以使用以下脚本对其

  • 问题内容: 我知道通过使用Xeger,我们可以获得指定模式的随机值。 我想知道是否有一种方法可以返回指定正则表达式的所有有效字符串。例如,对于模式:,我们可以得到所有的值来。 谢谢 编辑: 在这里,我们不考虑+和*等无限输出;我们如何获得有限正则表达式的所有值? 最后编辑: 感谢大家!最后,我不会考虑所有可能的值,因为可能有数千个。我限制一个特定的数字作为减少数量的值的数量。 问题答案: 由于正则

  • 我是JMeter的新手。我相信我已经成功安装了它,并且正在运行脚本记录器设置(http://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf)。当我启动用于拦截浏览器请求的JMeter代理服务器时,应该在jeter/bin文件夹中生成一个名为ApacheJMeterTemporaryRootCA.crt的文件。它不是。所以,我无法

  • 我在从客户端代码调用RESTful服务时遇到了一个问题。我已经使用CXF/Jackson编写了RESTful服务,部署到localhost中,并成功地使用RESTClient进行了测试。下面是服务代码的一个片段: 模型类和dao可以成功地工作,使用RESTClient服务本身也可以很好地工作。但是,当我试图从Java脚本调用这个服务时,我在服务器端得到以下错误: 公共类情绪计{ }