web-dev-qa-db-fra.com

Exemple de swagger @ApiModelProperty pour la propriété List <String>

J'ai une classe dans laquelle il y a une propriété qui est List<String>

public class MyClass {
    ....
    @ApiModelProperty(position = 2)
    private List<String> productIdentifiers;
    ....
}

Ce code génère les exemples de valeurs comme suit:

{
  "customerId": "1001",
  "productIdentifiers": [
    "string"
  ],
  "statuses": [
    "NEW"
  ]
}

Les exemples de valeurs présentés ici ne sont pas valides. Les exemples de valeurs attendus devraient ressembler à:

{
  "customerId": "1001",
  "productIdentifiers": [
    "PRD1",
    "PRD2",
    "PRD3"
  ],
  "statuses": [
    "NEW"
  ]
}

J'ai essayé de passer l'exemple d'attribut comme suit mais il ne génère pas la valeur correcte:

@ApiModelProperty(position = 2, example = "PRD1, PRD2, PRD3")
// This generates -> "productIdentifiers": "PRD1, PRD2, PRD3" // Its not json array

@ApiModelProperty(position = 2, example = "[\"PRD1\", \"PRD2\", \"PRD3\"]")
// This generates -> "productIdentifiers": "[\"PRD1\", \"PRD2\", \"PRD3\"]" // Its too not json array

Est-il possible de générer une valeur d'exemple appropriée pour la propriété List?

Mise à jour:

J'ai essayé les solutions suggérées par @nullpointer et @Zeeshan Arif

@ApiModelProperty(position = 2, dataType="List", example = "PRD1, PRD2, PRD3")
private List<String> productIdentifiers;
//This generates -> `"productIdentifiers": "PRD1, PRD2, PRD3"`

Mise à jour 2:

Essayé l'approche suivante qui n'a pas généré une réponse correcte

@ApiModelProperty(position = 2, dataType="Java.util.List<String>", example = "PRD1, PRD2, PRD3")
// This generates -> "productIdentifiers": "PRD1, PRD2, PRD3"


@ApiModelProperty(position = 2, dataType="String[]", example = "PRD1, PRD2, PRD3")
// This generates -> "productIdentifiers": "PRD1, PRD2, PRD3"

ma dépendance maven pour swagger jar est:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.5.0</version>
    <exclusions>
        <exclusion>
            <artifactId>mapstruct</artifactId>
            <groupId>org.mapstruct</groupId>
        </exclusion>
    </exclusions>
</dependency>

Update ticket github pour ce problème

38
Anil Bharadia

TLDR: L’un des contributeurs de Swagger-API a travaillé sur cette fonctionnalité pour l’ajouter à la version 3.0.0 mais la date de publication de celle-ci n’est pas encore connue. Pour l'instant, il se trouve sur la branche feature/3.0.0-rc2 du Switger-API GitHub

Je travaille avec Swagger depuis près de deux mois maintenant et au fur et à mesure de l'avancement de notre projet, de tels problèmes se sont manifestés. Maintenant, j'ai fait quelques recherches et lu sur les pages GitHub de l'API Swagger que cette fonctionnalité ne fonctionne tout simplement pas (encore).

Comme décrit ici et [voici un autre lien mais ma réputation n'est pas assez grande pour publier plus de 2 liens] cette fonctionnalité a été demandée plusieurs fois depuis août 2015 avec pas beaucoup de chance.

Maintenant sur ce problème sur le github de Swagger-API , un des contributeurs a commenté:

Cela nécessite une refactorisation majeure des modèles, qui est sur le chemin. 3 mars 2017

qui conduisent à un commentaire ultérieur:

Sera pris en charge dans la prise en charge 3.0.0, veuillez vous reporter à la branche fonctionnalité/3.0.0-rc2 pour plus de détails. 27 juin 2017

Et le 9 août 2017 quelqu'un a demandé quand la sortie de la version 3.0.0 serait sans autre réponse.

Ainsi, en conclusion, la prise en charge des exemples de tableaux/listes a été travaillée et devrait être disponible dans la version 3.0.0, mais aucune autre information sur la date de publication de celle-ci.

15
KoenC

J'ai réussi à le faire fonctionner, en générant une liste de chaînes.

Dans ApiModelProperty, définissez le type de données en tant que liste et écrivez votre exemple comme suit:

example = "[AddLine1,AddLine2,AddLine3,AddLine4]"

Voici mon exemple:

@ApiModelProperty(value = "Address", name = "addLines", dataType = "List",
    example = "[AddLine1,AddLine2,AddLine3,AddLine4]")

Lorsque je rends la page swagger, j'obtiens le résultat suivant:

"addLines": [
      "AddLine1",
      "AddLine2",
      "AddLine3",
      "AddLine4"
    ],
10
dane_griffiths

Vous utilisez simplement la notation Reflection. En utilisant

@ApiModelProperty(dataType = "[Ljava.lang.String;")

fonctionne bien, mais je ne peux pas mettre des exemples.

Voici le résultat:

{
  "field": [
    "string"
  ]
}
4
Daniel Borges

Une solution de contournement laide jusqu'à ce que nous ayons cette fonctionnalité correctement prise en charge, qui produit des exemples pour les listes avec un seul élément, mais permet au moins de montrer quelque chose de plus utile que simplement "string" est en utilisant allowableValues:

@ApiModelProperty(position = 2, allowableValues = "PRD1")
// This generates -> "productIdentifiers": ["PRD1"]
1
Helder Pereira

Essayez d'initialiser @ApiModelProperty comme suit:

public class MyClass {
    ....
    @ApiModelProperty(
        position = 2, datatype="List", example = "PRD1, PRD2, PRD3"
    )
    private List<String> productIdentifiers;
    ....
}
1
Zeeshan Arif

Voici un exemple de travail pour une liste d'objets. Swagger version 2.9.2. Il suffit que le type de données soit défini en tant que "Liste" et sera rendu dans la documentation swagger. Trouvez en pièce jointe la liste ProductAll enter image description here rendu dans l'image ci-jointe.

@ApiModel
public class ProductGetAllDTO {
    @ApiModelProperty(example="20")
    private String count;
    @ApiModelProperty(dataType="List", value = "rows")
    private List<ProductAll> rows;
}
0
tksilicon

Cela semble ne pas être pris en charge par l'API Swagger. En attendant, vous pouvez utiliser ce plugin Springfox pour générer un exemple de liste de singleton (une liste de valeurs) https://github.com/aaitmouloud/springfox-collection-example-plugin

Il suffit d'ajouter ceci à vous pom.xml

<dependency>
    <groupId>com.github.aaitmouloud</groupId>
    <artifactId>springfox-collection-example-plugin</artifactId>
    <version>2.9.2</version>
</dependency>

Et importez les bonnes classes dans votre contexte Spring

@ComponentScan({"springfox.collection.example.plugins"})

Vous devriez alors déclarer un exemple de valeur unique sur votre propriété et celle-ci sera transformée en exemple de liste de singleton par le plug-in (fonctionne pour tout Java.util.Collection Des classes)

@ApiModelProperty(value ="my property description", example = "2019-12-20T12:00:00")
@NotNull
private List<LocalDateTime> dates;

Disclaimer : Je suis l'auteur de ce plugin.

0
clapsus

J'ai changé mon exemple pour le code ci-dessous et cela a fonctionné.

public class MyClass {
....
@ApiModelProperty(
    position = 2, datatype="List", example = "'[''{''PRD1''}','{''PRD2''}'']"
)
private List<String> productIdentifiers;
....
}
0
bpedroso