Konfigurieren von Swagger UI, Jersey und Datei-upload?
Ich habe eine Jersey-Dienst mit einem Datei-upload-Methode sieht wie folgt aus (vereinfacht):
@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...
}
Es funktioniert und ich es testen kann erfolgreich mit Briefträger-Erweiterung in Chrome.
Jedoch, Swagger sieht 2 Parameter namens "Datei". Irgendwie scheint es zu verstehen, dass die InputStream
parameter und die FormDataContentDisposition
parameter sind eigentlich 2 Teile, die von den gleichen file
parameter, aber es versäumt, zu sehen, dass für die FormDataBodyPart
parameter.
Dies ist die Swagger JSON für die Parameter :
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
}]
Als Ergebnis, Swagger UI erzeugt ein Dateiauswahl-Feld, und ein extra Textfeld für den FormDataBodyPart argument :
Also, wenn ich wählen Sie eine Datei und schicken Sie das Formular in Swagger-UI, die ich am Ende der Lektüre der Inhalt des Textfeldes in den InputStream anstelle der Inhalt der hochgeladenen Datei. Und wenn ich das textfield leer ist, bekomme ich den Namen der Datei.
Wie kann ich anweisen, Swagger zu ignorieren, die FormDataBodyPart parameter ?
Alternativ als work-around, wie bekomme ich den media-Typ der hochgeladenen Datei ohne die FormDataBodyPart Objekt ?
Verwende ich Jersey 2.7 und Fors-jersey2-jaxrs_2.10 in der version 1.3.4.
InformationsquelleAutor Pierre Henry | 2014-04-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellen Sie ein stolzieren-filter für jersey und markieren Sie dann den parameter als interne oder eine andere Zeichenfolge gefiltert werden. Dies ist auch in diesem Beispiel gezeigt:
https://github.com/wordnik/swagger-core/blob/master/samples/java-jaxrs/src/main/java/com/wordnik/swagger/sample/util/ApiAuthorizationFilterImpl.java
Ihre service-Methode wird dieser parameter annotation
Dein filter wird es so Aussehen wie diese:
Registrieren Sie Ihre stolzieren filter für jersey-und dann wird es nicht zurück, Feld-und swagger-ui wird es nicht zeigen, das wird fix your upload-problem.
Hi @PierreHenry ich bin auch Erzeugung swagger json mit maven plugin, aber es zeigt java.io.InputStream als Typ nicht die java.io.Datei. Hast du dir schon mal diesen Fehler?
Sorry das war lange her und ich kann mich nicht erinnern. Sie wären besser dran, zu Fragen eine neue Frage denke ich.
InformationsquelleAutor user2362658
Es ist unklar, Wann dieser Hinzugefügt wurde-Jersey-aber ein Hinweis am Ende der Multipart-Abschnitt sagt "@FormDataParam annotation kann auch verwendet werden, die auf den Feldern". Sicher genug, können Sie dies tun:
Diese bietet die FormDataContentDisposition aber macht es "unsichtbar" zu Schwadronieren.
Update: Das funktioniert aber nicht, wenn es andere Ressourcen definiert (@Path-Annotationen), die nicht mehr FormDataContentDisposition. Wenn es dann Jersey scheitert zur Laufzeit, weil Sie nicht füllen Sie die fileDisposition Feld.
Eine bessere Lösung, wenn Sie eine neuere version von Swagger, markieren Sie einfach den parameter als versteckte wie so.
InformationsquelleAutor FinnTheHuman