我正在使用Spring启动创建REST Api,并使用swagger codegen在控制器中自动生成swagger文档。但是,我无法在POST请求中为String类型的参数设置描述和示例。这是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
}
最后,这就是招摇所显示的:
最后,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注释设置描述和身体参数的示例吗?
修改
我已经使用@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}")}))})
答案 0 :(得分:10)
在为身体对象生成示例时,我也遇到了类似的问题-注释@Example
和@ExampleProperty
在大摇大摆的1.5.x中根本没有任何作用。 (我使用1.5.16)
我当前的解决方案是:
将@ApiParam(example="...")
用于非物体,例如:
public void post(@PathParam("userId") @ApiParam(value = "userId", example = "4100003") Integer userId) {}
为 body 对象创建新的类,并使用@ApiModelProperty(value = " ", example = " ")
注释字段,例如:
@ApiModel(subTypes = {BalanceUpdate.class, UserMessage.class})
class PushRequest {
@ApiModelProperty(value = "status", example = "push")
private final String status;;
}
答案 1 :(得分:1)
实际上,example
批注的@ApiParam
属性的Java文档指出,该文档专门用于非主体参数。 examples
属性可用于正文参数的地方。
我测试了此批注
@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}"
)
)
)
导致为相应的方法生成以下错误信息:
/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
属性。
在code of swagger-ui中有一些对x-example
的引用(用于非主体参数的引用),但与x-examples
不匹配。那就是swagger-ui目前似乎不支持此功能。
如果确实需要显示此示例值,则当前最好的选择似乎是更改方法的签名并为body参数使用专用的域类型。如评论中所述,swagger将自动获取域类型的结构并在swagger-ui中打印一些不错的信息:
答案 2 :(得分:1)
Swagger.v3 Kotlin/Micronaut 示例:
@Post("/get-list")
fun getList(
@RequestBody(description = "Get list of ...",
content = [Content(
mediaType = "application/json",
schema = Schema(implementation = RequestDTO::class),
examples = [ExampleObject(value = """
{
"pagination": {
"page": 0,
"perPage": 10
},
"filter": {
"property_1": "string",
"property_2": "string"
},
"sort": {
"field": "property_1",
"order": "DESC"
}
}
""")]
)]) @Body request: RequestDTO): Response<SomeDTO> { ... }
答案 3 :(得分:0)
您是否尝试过以下操作?
@ApiModelProperty(
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}")
度过愉快的一天
答案 4 :(得分:0)
如果您使用swagger 2.9.2,则示例在此处不起作用。这些注释将被忽略
protected Map<String, Response> mapResponseMessages(Set<ResponseMessage> from) {
Map<String, Response> responses = newTreeMap();
for (ResponseMessage responseMessage : from) {
Property responseProperty;
ModelReference modelRef = responseMessage.getResponseModel();
responseProperty = modelRefToProperty(modelRef);
Response response = new Response()
.description(responseMessage.getMessage())
.schema(responseProperty);
**response.setExamples(Maps.<String, Object>newHashMap());**
response.setHeaders(transformEntries(responseMessage.getHeaders(), toPropertyEntry()));
Map<String, Object> extensions = new VendorExtensionsMapper()
.mapExtensions(responseMessage.getVendorExtensions());
response.getVendorExtensions().putAll(extensions);
responses.put(String.valueOf(responseMessage.getCode()), response);
}
return responses;
}
尝试使用摇摇欲坠的3.0.0-快照。 您需要像这样更改Maven依赖项:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webmvc</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
,然后将Swagger配置文件上的注释更改为:@ EnableSwagger2WebMvc