Comment configurer Swagger de l'INTERFACE utilisateur, de Jersey et de téléchargement de fichiers?

J'ai un Maillot avec un service de téléchargement de fichiers méthode qui ressemble à ceci (simplifié):

@POST
@Path("/{observationId : [a-zA-Z0-9_]+}/files")
@Produces({ MediaType.APPLICATION_JSON})
@Consumes(MediaType.MULTIPART_FORM_DATA)
@ApiOperation(
    value = "Add a file to an observation",
    notes = "Adds a file to an observation and returns a JSON representation of the uploaded file.",
    response = ObservationMediaFile.class
)
@ApiResponses({
    @ApiResponse(code = 404, message = "Observation not found. Invalid observation ID."),
    @ApiResponse(code = 406, message= "The media type of the uploaded file is not supported. Currently supported types are 'images/*' where '*' can be 'jpeg', 'gif', 'png' or 'tiff',")
})
public RestResponse<ObservationMediaFile> addFileToObservation(
    @PathParam("observationId") Long observationId,
    @FormDataParam("file") InputStream is,
    @FormDataParam("file") FormDataContentDisposition fileDetail,
    @FormDataParam("fileBodyPart") FormDataBodyPart body
){

    MediaType type = body.getMediaType();

    //Validate the media type of the uploaded file...
    if( /* validate it is an image */    ){
        throw new NotAcceptableException("Not an image. Get out.");
    }

    //do something with the content of the file
    try{
        byte[] bytes = IOUtils.toByteArray(is);
    }catch(IOException e){}

    //return response...
}

Ça fonctionne et je peux le tester avec succès en utilisant le Facteur d'extension dans Chrome.

Cependant, Swagger voit 2 paramètres nommé "fichier". D'une certaine manière, il semble comprendre que le InputStream paramètre et la FormDataContentDisposition paramètre sont en fait 2 parties de la même file paramètre, mais il ne parvient pas à voir que, pour les FormDataBodyPart paramètre.

C'est l'Arrogance JSON pour les paramètres :

parameters: [
{
  name: "observationId",
  required: true,
  type: "integer",
  format: "int64",
  paramType: "path",
  allowMultiple: false
},
{
  name: "file",
  required: false,
  type: "File",
  paramType: "body",
  allowMultiple: false
},
{
  name: "fileBodyPart",
  required: false,
  type: "FormDataBodyPart",
  paramType: "form",
  allowMultiple: false
}]

Comme un résultat, Swagger INTERFACE utilisateur génère un fichier sélecteur de champ, et d'un champ de texte pour le FormDataBodyPart argument :

Comment configurer Swagger de l'INTERFACE utilisateur, de Jersey et de téléchargement de fichiers?

Alors, quand je choisis un fichier et envoyer le formulaire à Swagger de l'INTERFACE utilisateur, je finis de lire le contenu du champ de texte dans l'InputStream plutôt que le contenu du fichier téléchargé. Et si je laisse le champ vide, je reçois le nom du fichier.

Comment puis-je charger Swagger pour ignorer la FormDataBodyPart paramètre ?

Sinon, comme un travail autour de nous, comment puis-je obtenir le type de média de fichier téléchargé sans le FormDataBodyPart objet ?

- Je utiliser Jersey 2.7 et swagger-jersey2-jaxrs_2.10 version 1.3.4.

Quelqu'un sait si ce fichier de téléchargement est possible avec jersey1? (Je suis en utilisant 1.19) de toute façon je ne peux pas obtenir le téléchargement de fichiers de travail, même si j'ai multipart/form-data. Aussi dans les Paramètres, il est montré comme un "corps" pas comme "fichier"

OriginalL'auteur Pierre Henry | 2014-04-17