2015-11-01 5 views
5

ich etwa 40 APIs haben, die ähnliche Basisantwortstruktur haben wie folgt:Wie eine generische Typklasse für Swagger API-Antwort angeben

{ 
    "lastAccessed": "2015-30-08:14:21:45T", 
    "createdOn": "2015-30-07:09:04:10T", 
    "lastModified": "2015-30-08:14:21:45T", 
    "isReadOnly": "false", 
    "usersAllowed" : ["Tim", "Matt", "Christine"]; 
    "noOfEntries": 1, 
    "object": [ 
     "ObjectA": { 
      //here object A has its own model 
     } 
    ] 
} 

So habe ich eine Basis Response-Klasse ein generisches vom Typ T nimmt wie folgt :

public class Response<T> { 
    @ApiModelProperty(value="Last time accessed") 
    private String lastAccessed; 
    @ApiModelProperty(value="Time when Created ") 
    private String createdOn; 
    private String lastModified; 
    @ApiModelProperty(value="Created on") 
    private boolean isReadOnly; 
    @ApiModelProperty(value="Users that has access to the object.") 
    private List<String> usersAllowed; 
    private int noOfEntries; 
    private T object; 

    //getters and setters 
} 

Also für die API-A, der das Objekt vom Typ mit seinen eigenen Feldern zurückgibt, ich Antwort als die API-Antwort in der Steuerung zurückkehre:

public class A { 
    @ApiModelProperty(value="Name") 
    private String name; 
    @ApiModelProperty(value="OID") 
    private String id;  
    //getters and setters 
}  

In der Steuerung: Antwortdaten = neu Response(); ResponseEntity Response = neu ResponseEntity <> (Daten, HttpStatus.OK);

Gibt es eine Möglichkeit in Swagger kann ich das Modell des Antwortobjekts rekursiv angeben? Zum Beispiel könnte ich die Annotation @ApiOperation (response = Response.class) haben, aber das würde nicht das Modell für A.

Antwort

2

Ich weiß, das ist ein alter Beitrag, aber für jeden anderen auf der Suche nach einer Antwort zu diesem:

Dies kann für die Antwortobjekte List, Set und Map erfolgen, aber jede andere Klassenklasse mit generischen Typen wird ignoriert. Wenn Sie einen dieser drei verwenden, geben Sie diese im Feld responseContainer und im abgeleiteten Typ im Feld response an.

@ApiResponse(code = 200, responseContainer="List", respone=java.lang.String.class) 
0

Ich bin mit Prahlerei 2 und für mich, dieses Problem behoben folgen.

entfernen 'Antwort' Eigenschaft von beiden @ApiResponse und @ApiOperation. Dann wird swagger automatisch die Antwortklasse für Sie für 200 OK aus Methodenstubs generieren (unabhängig davon, ob mit/ohne Generika in Antwortklasse).

@ApiOperation(value = "what your operation does") 

@ApiResponses(value = { @ApiResponse(code = 200, message = "Success message") }) 
Verwandte Themen