Swagger-core: Dans un ApiModel swagger imbriqué, l'« exemple » ApiModelProperty de l'ApiModel interne n'est pas affiché dans la définition swagger

Créé le 7 oct. 2016  ·  5Commentaires  ·  Source: swagger-api/swagger-core

Salut,

J'ai un ApiModel qui contient un autre ApiModel (imbriqué). Dans le fichier de définition swagger, généré pour mon application web, n'a pas la propriété annotée, 'exemple', pour les attributs qui sont là dans l'ApiModel imbriqué ( inner ApiModel ). Mais les valeurs d'exemple annotées pour les attributs de l' ApiModel externe sont présentes dans la définition swagger.

Permettez-moi d'expliquer davantage cela avec un exemple. (Je vais expliquer ce que j'entends par ApiModel interne et ApiModel externe à travers l'exemple suivant)

Ma classe "ListActivity" est annotée avec l'annotation "@ApiModel" comme ci-dessous. Ceci est l' ApiModel externe

@ApiModel(
            value = "List of activities", 
            description = "This contains a set of activities that matches a given criteria as a collection")
public class ActivityList

Dans la classe "ActivityList", j'ai deux attributs. Ce sont des entiers -> "count" et List-> "activités". Ces deux attributs sont annotés à l'aide de l'annotation "@ApiModelProperty" comme ci-dessous.

@ApiModelProperty(
            value = "Number of total resources.",
            example = "1")
 @JsonProperty("count")
 private int count;

@ApiModelProperty(
            value = "Returns the list of activities that match the offset and limit parameter values that were specified.")
@JsonProperty("activities")
private List<Activity> activities;

Puisque "Activity" est un objet, j'ai créé un ApiModel pour la classe "Activity". Je l'annote comme ci-dessous.

Il s'agit maintenant de l' ApiModel interne qui se trouve à l'intérieur de l'ApiModel "ActivityList" ( ApiModel externe ).
(J'espère que vous pouvez maintenant comprendre ce que je voulais dire par ApiModels imbriqués).

@ApiModel(
          value = "Activity", 
         description = "An activity instance carries a unique identifier that can be used to identify a particular operation instance uniquely")
public class Activity;

Dans la classe "Activité", j'ai deux autres attributs. Ce sont String -> "activityId" et String -> "code". J'annote ces attributs à l'aide de

@ApiModelProperty(
            name = "activityId",
            value = "Activity identifier",
            required = true,
            example = "ACTIVITY_1")
@JsonProperty("activityId")
private String activityId;

@ApiModelProperty(
            name = "code",
            value = "Activity code",
            required = true,
            example = "DEVICE_RING")
@JsonProperty("code")
private String code;

Après cela, je génère le fichier de définition swagger. Dans le fichier généré, les valeurs d'exemple ont été définies uniquement sur l'attribut "count" qui se trouvait dans l' ApiModel externe . Cela signifie que la valeur d'exemple de l'attribut "count" est définie sur "1" comme je l'ai annoté dans l'exemple ci-dessus.

Mais toutes les valeurs d'exemple que j'ai définies dans ApiModel interne qui sont les attributs de la classe "Activity", ne viennent pas dans le fichier de définition swagger généré. Au lieu de cela, il ne montre que "type": "string". Conformément à l'exemple donné ci-dessus, les valeurs d'exemple, "ACTIVITY_1" et "DEVICE_RING" ne sont pas définies dans le fichier de définition swagger, pour les attributs "activityId" et "code".

Par conséquent, sur l'interface utilisateur de swagger, le schéma json que j'obtiens est comme indiqué ci-dessous. Seul « count » est défini sur « 1 » et les autres clés sont définies avec leurs types de données.

{
    "count": 1,
    "activities": [{
        "activityId": "string",
        "code": "string"
    }]
}

La définition de swagger est comme ci-dessous.

 "List of activities": {
         "type": "object",
         "properties": {
            "count": {
               "type": "integer",
               "format": "int32",
               "example": 1, **(example values are set here as given in the annotations)** 
               "description": "Number of total resources."
            },

            "activities": {
               "type": "array",
               "description": "Returns the list of activities that match the offset and limit parameter values that were specified.",
               "items": {
                  "$ref": "#/definitions/Activity"
               }
            }
         },
         "description": "This contains a set of activities that matches a given criteria as a collection"
}


"Activity": {
         "type": "object",
         "properties": {
            "activityId": {
               "type": "string" **(example values are not set here though I set it in the annotations, even the property 'example' isn't displayed)**  
            }
         }
 }

Par conséquent, dans un ApiModel swagger imbriqué, l'« exemple » ApiModelProperty de l'ApiModel interne n'est pas affiché sur la définition swagger.

Y a-t-il de toute façon que je puisse définir cette propriété d'exemple sur les attributs de l'

Merci

Commentaire le plus utile

Salut,

quel est le statut de cette question? On ne sait pas pourquoi il a été fermé. Je rencontre une situation qui ressemble à ce qui est décrit ci-dessus dans Java lorsque les objets imbriqués, dont les classes sont annotées avec @ApiModel , ne sont pas générés dans la définition de l'API client JSON swagger. Cela ne fait aucune différence si les classes Java des objets imbriqués sont placées dans leur propre unité de compilation sont déclarées comme classes imbriquées de la classe d'arguments API pour laquelle le JSON est généré.

Merci de me le faire savoir

Tous les 5 commentaires

Veuillez créer un cas de test pour cela dans un PR

Salut,

quel est le statut de cette question? On ne sait pas pourquoi il a été fermé. Je rencontre une situation qui ressemble à ce qui est décrit ci-dessus dans Java lorsque les objets imbriqués, dont les classes sont annotées avec @ApiModel , ne sont pas générés dans la définition de l'API client JSON swagger. Cela ne fait aucune différence si les classes Java des objets imbriqués sont placées dans leur propre unité de compilation sont déclarées comme classes imbriquées de la classe d'arguments API pour laquelle le JSON est généré.

Merci de me le faire savoir

quelle est la solution apportée ?

toujours pas résolu en 2020 ?

C'est un problème clos depuis 2016. Beaucoup de choses ont changé depuis lors. Si vous rencontrez toujours un problème, il est préférable de déposer un nouveau ticket détaillé.

Cette page vous a été utile?
0 / 5 - 0 notes