Swagger-core: In einem verschachtelten swagger ApiModel wird die ApiModelProperty 'Beispiel' des inneren ApiModels nicht in der swagger Definition angezeigt

Erstellt am 7. Okt. 2016  ·  5Kommentare  ·  Quelle: swagger-api/swagger-core

Hi,

Ich habe ein ApiModel, das ein anderes ApiModel enthält (verschachtelt). In der für meine Web-App generierten Swagger-Definitionsdatei fehlt die annotierte Eigenschaft "example" für die Attribute, die sich im verschachtelten ApiModel ( inner ApiModel ) befinden. Annotierte Beispielwerte für die Attribute im äußeren ApiModel sind jedoch in der Swagger-Definition enthalten.

Lassen Sie mich dies anhand eines Beispiels näher erläutern. (Ich werde im folgenden Beispiel erklären, was ich mit innerem ApiModel und äußerem ApiModel gemeint habe)

Meine Klasse "ListActivity" ist mit der Annotation "@ApiModel" wie unten beschrieben versehen. Dies ist das äußere ApiModel

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

Innerhalb der Klasse "ActivityList" habe ich zwei Attribute. Das sind Integer -> "count" und List-> "Aktivitäten". Beide Attribute werden mit der Annotation "@ApiModelProperty" wie unten beschrieben annotiert.

@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;

Da "Activity" ein Objekt ist, habe ich ein ApiModel für die "Activity"-Klasse erstellt. Ich bemerke es wie unten.

Dies ist nun das innere ApiModel, das sich innerhalb des ApiModel "ActivityList" ( äußeres ApiModel ) befindet.
(Ich hoffe, Sie können jetzt verstehen, was ich mit verschachtelten ApiModels meinte).

@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;

Innerhalb der Klasse "Aktivität" habe ich zwei weitere Attribute. Das sind String -> "activityId" und String -> "code". Ich beschrifte diese Attribute mit

@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;

Danach erstelle ich die Swagger-Definitionsdatei. In der generierten Datei wurden Beispielwerte nur auf das Attribut "count" gesetzt, das sich im äußeren ApiModel befand . Das bedeutet, dass der Beispielwert des Attributs "count" auf "1" gesetzt ist, wie ich im obigen Beispiel annotiert habe.

Aber alle Beispielwerte, die ich im inneren ApiModel gesetzt habe, die die Attribute der "Activity" -Klasse sind, kommen nicht in die generierte Swagger-Definitionsdatei. Stattdessen wird nur "type": "string" angezeigt. Wie im obigen Beispiel angegeben, sind die Beispielwerte "ACTIVITY_1" und "DEVICE_RING" in der Swagger-Definitionsdatei für die Attribute "activityId" und "code" nicht festgelegt.

Daher ist das Json-Schema, das ich auf der Swagger-Benutzeroberfläche erhalte, wie unten gezeigt. Nur "count" wird auf "1" gesetzt und andere Schlüssel werden mit ihren Datentypen gesetzt.

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

Die Prahlerei-Definition ist wie folgt.

 "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)**  
            }
         }
 }

Daher wird in einem verschachtelten swagger-ApiModel das ApiModelProperty-'Beispiel' des inneren ApiModels nicht in der swagger-Definition angezeigt.

Gibt es irgendwie, dass ich diese Beispieleigenschaft auf die Attribute des inneren ApiModel setzen kann , wenn ich die Swagger-Definition

Dankeschön

Hilfreichster Kommentar

Hi,

wie ist der Status dieses Problems? Es ist nicht klar, warum es geschlossen wurde. Ich erlebe eine Situation, die der oben beschriebenen in Java ähnelt, wenn verschachtelte Objekte, deren Klassen mit @ApiModel annotiert sind, nicht in der Swagger-JSON-Client-API-Definition generiert werden. Es macht keinen Unterschied, ob die Java-Klassen der verschachtelten Objekte in einer eigenen Kompilierungseinheit platziert werden, als verschachtelte Klassen der API-Argumentklasse deklariert werden, für die der JSON generiert wird.

Danke für die Information

Alle 5 Kommentare

Bitte erstellen Sie hierzu einen Testfall in einer PR

Hi,

wie ist der Status dieses Problems? Es ist nicht klar, warum es geschlossen wurde. Ich erlebe eine Situation, die der oben beschriebenen in Java ähnelt, wenn verschachtelte Objekte, deren Klassen mit @ApiModel annotiert sind, nicht in der Swagger-JSON-Client-API-Definition generiert werden. Es macht keinen Unterschied, ob die Java-Klassen der verschachtelten Objekte in einer eigenen Kompilierungseinheit platziert werden, als verschachtelte Klassen der API-Argumentklasse deklariert werden, für die der JSON generiert wird.

Danke für die Information

was ist die angebotene lösung?

2020 noch ungelöst?

Es ist eine abgeschlossene Ausgabe von 2016. Seitdem hat sich viel geändert. Wenn weiterhin ein Problem auftritt, ist es besser, ein neues detailliertes Ticket zu erstellen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen