2015-11-01 8 views
5

Ho circa 40 API che hanno analoga struttura di risposta di base come segue:Come specificare una classe di tipo generico per una risposta API Swagger

{ 
    "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 
     } 
    ] 
} 

quindi ho una classe di risposta di base prendendo un generico di tipo T come segue :

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 
} 

Così, per l'API a, che restituisce l'oggetto di tipo con i propri campi, sto tornando di risposta come la risposta API nel controller:

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

Nel controller: Dati di risposta = nuova risposta(); ResponseEntity response = new ResponseEntity <> (dati, HttpStatus.OK);

C'è un modo in swagger Posso specificare il modello dell'oggetto risposta in modo ricorsivo? Ad esempio, potrei avere l'annotazione @ApiOperation (response = Response.class) ma non avrebbe il modello per A.

risposta

2

So che questo è un vecchio post, ma per chiunque altro cerchi una risposta a questo:

Questo può essere fatto per gli oggetti risposta List, Set e Map ma qualsiasi altra classe con tipi generici verrà ignorata. Se si utilizza uno di questi tre, quindi li si specifica nel campo responseContainer e il tipo dedotto nel campo response.

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

Sto usando spavalderia 2 e seguendo risolto questo problema per me.

Rimuovi 'risposta' proprietà da entrambi @ApiResponse e @ApiOperation. Quindi swagger genera automaticamente la classe di risposta per voi per 200 OK da stub metodo (indipendentemente se con/senza generici nella classe di risposta).

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

@ApiResponses(value = { @ApiResponse(code = 200, message = "Success message") }) 
Problemi correlati