Je suis en train de créer une Api REST en utilisant Spring boot, et en générant automatiquement la documentation swagger dans les contrôleurs en utilisant swagger codegen. Cependant, je ne suis pas en mesure de définir une description et un exemple pour un paramètre de type String dans une requête POST. Voici mon code :
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;
}
La propriété d'exemple de l'@ApiParam a été insérée manuellement par moi, parce que le codegen ignorait cette partie du yaml (C'est une autre question : pourquoi l'éditeur ignore-t-il la partie d'exemple ?). Voici une partie du 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
}
Et enfin, c'est ce que montre Swagger :
Enfin, les dépendances utilisées dans build.gradle sont les suivantes :
compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'
Donc, la question est : Quelqu'un sait-il comment je peux définir la description et un exemple d'un paramètre de corps en utilisant les annotations swagger ?
EDIT
J'ai réussi à modifier la description en utilisant @ApiImplicitParam au lieu de @ApiParam, mais l'exemple est toujours absent :
@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 votes
Dans votre exemple, vous dites
kambiTransaction
est de typeString
mais votre méthode consommeapplication/json
. En d'autres termes, vous voulez envoyer une chaîne de texte brut (qui contient du JSON - comme indiqué dans l'exemple de valeur) enveloppée dans du JSON ? Pourquoi ne pas créer une classe de domaine pour les éléments suivantskambiTransaction
. Swagger imprimera automatiquement la structure de la classe comme exemple JSON.0 votes
Je suis d'accord avec @dpr. La bonne méthode consiste à créer une classe de modèle et à utiliser les annotations. ApiModel sur la classe et ApiModelProperty sur les champs. ApiModelProperty accepte les paramètres valeur et exemple.