2014-12-25 1 views
5

Ich habe einen Jersey REST Service, zu dem Daten gepostet werden. Es wird eine CSV-Datei geben, bei der es sich um die eigentlichen Daten und einige Metadaten für diese CSV handelt (das Meta kann entweder im JSON- oder im XML-Format vorliegen). Wie soll die Methodensignatur und begleiten Anmerkungen für den Service aussehen, wenn diese beiden gebucht werden müssen, sollte es so etwas wie ...Java Rest Jersey: Mehrere Arten von Daten (Datei und JSON) schreiben

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces({MediaType.APPLICATION_JSON}) 
public CreateTaskVO provideService(@FormParam("meta") String v1, 
     @FormParam("data") InputStream v2) { 

Hier habe ich den ersten Parameter am Vorstellungsvermögen ein JSON-String zu sein, Metadaten und der zweite ein Eingabestrom der tatsächlichen Daten. Würde das funktionieren?

Antwort

7

Sie sollten ein mehrteiliges Format verwenden. Es besteht im Grunde aus einer einzigen Nachricht vom Typ multipart/xxx (wobei xxx kann etwas wie form-data sein), und diese Nachricht besteht aus anderen "vollständigen" Nachrichten mit ihren eigenen Content-Typ und andere Metadaten.

Sie nicht die Jersey-Version angegeben haben, aber mit Jersey 2.xx starten, ist es mehrt Unterstützung in Form eines separaten Artefakt vorhanden,:

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-multipart</artifactId> 
    <version>${jersey.version}</version> 
</dependency> 

Dann brauchen Sie nur die Funktion registrieren , wie gesehen here in Registration.

Dann können Sie einfach verwenden @FormDataParam

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces({MediaType.APPLICATION_JSON}) 
public CreateTaskVO provideService(
       @FormDataParam("meta") String jsonMeta, 
       @FormDataParam("data") InputStream file, 
       @FormDataParam("data") FormDataContentDisposition fileDetail) { 

Sie here an example von sehen können, wie die Daten vom Client gesendet werden, und auch das interne Nachrichtentext Format eines mehrteiliger

Andere rreading:


UPDATE

Es gibt auch für Multipart in Jersey 1.x.x unterstützen wird, in Form von dieses Artefakt

<dependency> 
    <groupId>com.sun.jersey.contribs</groupId> 
    <artifactId>jersey-multipart</artifactId> 
    <version>${jersey.version}</version> 
</dependency> 
Verwandte Themen