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 :
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.
OriginalL'auteur Pierre Henry | 2014-04-17
Vous devez vous connecter pour publier un commentaire.
Créer un swagger filtre à jersey, puis marquez le paramètre interne ou une autre chaîne que vous filtrez. Ceci est également indiqué dans cet exemple:
https://github.com/wordnik/swagger-core/blob/master/samples/java-jaxrs/src/main/java/com/wordnik/swagger/sample/util/ApiAuthorizationFilterImpl.java
Votre méthode de service aura ce paramètre annotation
Votre filtre cherchez comme ceci:
Enregistrer votre swagger filtre pour le jersey et il ne sera pas de retour ce domaine et swagger-ui ne sera pas le montrer qui permettra de résoudre votre problème de transfert.
Salut @PierreHenry je suis aussi de la génération swagger json à l'aide de maven plugin, mais c'est de java.io.InputStream comme un type pas du java.io.Fichier. Avez-vous jamais obtenir cette erreur?
Désolé, c'était il y a longtemps et je ne me souviens pas. Vous seriez mieux de poser une nouvelle question, je suppose.
OriginalL'auteur user2362658
Il est difficile de savoir quand cela a été ajouté à Jersey, mais une note à la fin de la Multipart l'article dit "@FormDataParam annotation peut être également utilisé sur les champs de". Bien sûr vous pouvez faire ceci:
Ceci fournit la FormDataContentDisposition, mais il est "invisible" pour Swagger.
Mise à jour: Cela fonctionne, mais pas si il y a d'autres ressources définies (@Path annotations) qui ne prennent pas FormDataContentDisposition. Si il y a ensuite Jersey échec à l'exécution, car il ne peut pas remplir le fileDisposition champ.
Une meilleure solution si vous utilisez une version récente de Swagger pour marquer simplement le paramètre caché comme si.
OriginalL'auteur FinnTheHuman