2017-09-15 1 views
1

Ich habe einen Rest-Aufruf, der einige Parameter als FormDataParam nimmt. Wenn ich das Objekt EngineConfigMeta in JSON-String an den Rest-Aufruf vom Postboten übergebe, wird das Objekt auf der Rescallebene nicht richtig deserialisiert.FormDataParam Object übergeben als JSON-String in Post-Anfrage wird nicht richtig deserialisiert

Rast-call

@Path("/add-config") 
@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
public Response addConfig(@FormDataParam("config") EngineConfigMeta config, 
     @FormDataParam("file") InputStream configFileInputStream, 
     @FormDataParam("file") FormDataContentDisposition cdh) 
{ 

    return Response.ok(Response.Status.OK).entity(buildJson(config.getVersion())).build(); 
} 

EngineConfigMeta.java

public class EngineConfigMeta { 

    private String tenantName; 
    private long version; 

    EngineConfigMeta(String tenantName, long version) { 
    this.tenantName = tenantName; 
    this.version = version; 
    } 

    ..getters and setters 
} 

Dies ist, wie ich die Parameter am Übergang Anruf mit Postbote zur Ruhe - Postman screenshot

Das Problem ist jetzt, wenn ich den Code der Ruhe Anruf debuggen, ich alle JSON-String auf EngineConfigMeta pojo nur auf eine Eigenschaft zugewiesen bekommen -

EngineConfigMeta{tenantName={"tenantName": "abc", "version": 2}, version=0} 

Wie Sie oben, dass das gesamte Objekt JSON-String zugewiesen sehen ist zur Eigenschaft tenantName. Die Deserialisierung ist also hier nicht korrekt.

Bitte helfen Sie mir.

Antwort

0

Es ist, weil der Client den Content-Type Header für den einzelnen "config" Teil festlegen muss. Wenn Sie dies nicht tun, wird standardmäßig text/plain verwendet. Da Sie einen Konstruktor haben, der den String akzeptiert, nimmt Jersey einfach an, den eingehenden Part-Daten den Wert des Konstruktorarguments zuzuweisen.

In Postman Ich glaube nicht, dass Sie den Inhaltstyp des einzelnen Teils festlegen können. Was Sie tun müssen, ist den Typ manuell auf der Serverseite mit einem FormDataBodyPart. Dann können Sie manuell die EngineConfigMeta bekommen.

public Response post(@FormDataParam("config") FormDataBodyPart part) { 
    part.setMediaType(MediaType.APPLICATION_JSON_TYPE); 
    EngineConfigMeta meta = part.getValueAs(EngineConfigMeta.class); 
} 

Siehe auch:

+0

Danke für die Antwort, habe ich versucht bereits, dass vor und es scheint zu arbeiten. – thedevd

Verwandte Themen