如何在Swagger中使用Swagger注释设置描述和示例?

2022-08-31 20:19:13

我正在使用Spring boot创建一个REST Api,并使用swagger codegen在控制器中自动生成swagger文档。但是,我无法在POST请求中为字符串类型的参数设置描述和示例。下面是 mi 代码:

import io.swagger.annotations.*;

@Api(value = "transaction", tags = {"transaction"})
@FunctionalInterface
public interface ITransactionsApi {
    @ApiOperation(value = "Places a new transaction on the system.", notes = "Creates a new transaction in the system. See the schema of the Transaction parameter for more information ", tags={ "transaction", })
    @ApiResponses(value = {
        @ApiResponse(code = 200, message = "Another transaction with the same messageId already exists in the system. No transaction was created."),
        @ApiResponse(code = 201, message = "The transaction has been correctly created in the system"),
        @ApiResponse(code = 400, message = "The transaction schema is invalid and therefore the transaction has not been created.", response = String.class),
        @ApiResponse(code = 415, message = "The content type is unsupported"),
        @ApiResponse(code = 500, message = "An unexpected error has occurred. The error has been logged and is being investigated.") })

    @RequestMapping(value = "/transaction",
        produces = { "text/plain" },
        consumes = { "application/json" },
        method = RequestMethod.POST)
    ResponseEntity<Void> createTransaction(
        @ApiParam(
            value = "A JSON value representing a transaction. An example of the expected schema can be found down here. The fields marked with an * means that they are required." ,
            example = "{foo: whatever, bar: whatever2}")
        @Valid @RequestBody String kambiTransaction) throws InvalidTransactionException;
}

@ApiParam的示例属性是我手动插入的,因为 codegen 忽略了 yaml 的这一部分(这是另一个问题:为什么编辑器忽略了示例部分?)。这是yaml的一部分:

paths:
  /transaction:
    post:
      tags:
        - transaction
      summary: Place a new transaction on the system.
      description: >
        Creates a new transaction in the system. See the schema of the Transaction parameter
        for more information
      operationId: createTransaction
      parameters:
        - $ref: '#/parameters/transaction'
      consumes:
        - application/json
      produces:
        - text/plain
      responses:
        '200':
          description: Another transaction with the same messageId already exists in the system. No transaction was created.
        '201':
          description: The transaction has been correctly created in the system
        '400':
          description: The transaction schema is invalid and therefore the transaction has not been created.
          schema:
            type: string
            description: error message explaining why the request is a bad request.
        '415':
          description: The content type is unsupported
        '500':
          $ref: '#/responses/Standard500ErrorResponse'

parameters:
  transaction:
    name: kambiTransaction
    in: body
    required: true
    description: A JSON value representing a kambi transaction. An example of the expected schema can be found down here. The fields marked with an * means that they are required.
    schema:
      type: string
      example:
        {
          foo*: whatever,
          bar: whatever2
        }

最后,这就是swagger所展示的:

enter image description here

最后,build.gradle 中使用的依赖项如下:

compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'

所以,问题是:有谁知道如何使用swagger注释设置body参数的描述和示例?

编辑

我已经实现了使用@ApiImplicitParam而不是@ApiParam来更改描述,但仍然缺少示例:

@ApiImplicitParams({
    @ApiImplicitParam(
        name = "kambiTransaction",
        value = "A JSON value representing a transaction. An example of the expected schema can be found down here. The fields marked with * means that they are required. See the schema of KambiTransaction for more information.",
        required = true,
        dataType = "String",
        paramType = "body",
        examples = @Example(value = {@ExampleProperty(mediaType = "application/json", value = "{foo: whatever, bar: whatever2}")}))})

答案 1

我在为身体对象生成示例时遇到了类似的问题 - 注释,并且在swagger 1.5.x中根本无法无缘无故地工作(我使用1.5.16)@Example@ExampleProperty

我目前的解决方案是:
用于非身体物体,例如:@ApiParam(example="...")

public void post(@PathParam("userId") @ApiParam(value = "userId", example = "4100003") Integer userId) {}

对于正文对象,创建新类并注释字段,例如:@ApiModelProperty(value = " ", example = " ")

@ApiModel(subTypes = {BalanceUpdate.class, UserMessage.class})
class PushRequest {
    @ApiModelProperty(value = "status", example = "push")
    private final String status;;
}

答案 2

实际上,注释属性的 java 文档指出,这专门用于非 body 参数。其中,该属性可用于正文参数。example@ApiParamexamples

我测试了这个注释

@ApiParam(
  value = "A JSON value representing a transaction. An example of the expected schema can be found down here. The fields marked with an * means that they are required.",
  examples = @Example(value = 
    @ExampleProperty(
      mediaType = MediaType.APPLICATION_JSON,
      value = "{foo: whatever, bar: whatever2}"
    )
  )
)

这导致为相应的方法生成以下 swagger:

/transaction:
  post:
  ...
    parameters:
    ...
    - in: "body"
      name: "body"
      description: "A JSON value representing a transaction. An example of the expected\
        \ schema can be found down here. The fields marked with an * means that\
        \ they are required."
      required: false
      schema:
        type: "string"  
      x-examples:
        application/json: "{foo: whatever, bar: whatever2}"

但是,这个值似乎没有被swagger-ui拾取。我尝试了版本2.2.10和最新的3.17.4,但这两个版本都没有使用swagger的属性。x-examples

swagger-ui 的代码中有一些引用(用于非 body 参数的引用),但与 不匹配。也就是说,目前似乎没有得到swagger-ui的支持。x-examplex-examples

如果您确实需要此示例值,则目前最好的选择似乎是更改方法的签名,并对 body 参数使用专用的域类型。正如已经在评论中所述,swagger会自动拾取域类型的结构,并在swagger-ui中打印一些不错的信息:

Swagger-UI 2.2.10 with domain type info


推荐