2012-04-26 5 views
8

Ich habe einen Arbeits json Service, der wie folgt aussieht:Wie poste ich einen Pojo mit Jersey Client, ohne manuell zu JSON konvertieren zu müssen?

@POST 
@Path("/{id}/query") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(JSON) 
public ListWrapper query(@Context SecurityContext sc, @PathParam("id") Integer projectId, Query searchQuery) { 
    ... 
    return result 
} 

Die Abfrage Objekt sieht wie folgt aus und wenn eine json Darstellung dieses Objekt Abfrage Entsendung funktioniert es schön aus.

@XmlRootElement 
public class Query { 
    Integer id; 
    String query; 
    ... // Getters and Setters etc.. 
} 

Jetzt mag ich das Objekt von einem Client füllen und Jersey-Client verwenden, dass die Query-Objekt in den Dienst zu stellen und eine JSONObject als Ergebnis zu erhalten. Mein Verständnis ist, dass es getan werden könnte, ohne es zuerst zu einem JSON-Objekt zu konvertieren und dann als String zu veröffentlichen.

Ich habe so etwas versucht, aber ich denke, ich vermisse etwas.

public static JSONObject query(Query searchQuery){ 
    String url = baseUrl + "project/"+searchQuery.getProjectId() +"/query"; 
    WebResource webResource = client.resource(url); 
    webResource.entity(searchQuery, MediaType.APPLICATION_JSON_TYPE); 
    JSONObject response = webResource.post(JSONObject.class); 
    return response; 
} 

Ich benutze Jersey 1.12.

Jede Hilfe oder Zeiger in die richtige Richtung würde sehr geschätzt werden.

Antwort

3

Wenn Ihr Web-Service eine JSON erzeugt Sie, dass in Ihrem Client unter Verwendung eines accept() Methode behandeln müssen:

ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).post(searchQuery, MediaType.APPLICATION_JSON); 
ListWrapper listWrapper = response.getEntity(ListWrapper.class); 

die Sie interessieren und Ihre Ergebnisse.

+1

Vielen Dank! Sie haben mich mit der ClientResponse auf den richtigen Weg gebracht. Ich musste noch ein paar zusätzliche Sachen machen: 'WebResource webResource = client.resource (url); ClientResponse-Antwort = webResource.type (MediaType.APPLICATION_JSON_TYPE) .accept (MediaType.APPLICATION_JSON) .post (ClientResponse.class, searchQuery); ListWrapper listWrapper = response.getEntity (ListWrapper.class); ' Jetzt habe ich eine JsonMappingException, aber ich denke, es ist ein Fehler in der Json-Ergebnis. – Perty

+0

Entschuldigung mein Markup: -/ – Perty

5

Die Methode WebResource.entity (...) ändert Ihre webResource-Instanz nicht ... Sie erstellt und gibt ein Builder-Objekt zurück, das die Änderung enthält. Ihr Aufruf an .post wird normalerweise von einem Builder-Objekt statt vom WebResource-Objekt ausgeführt. Dieser Übergang wird leicht verdeckt, wenn alle Anforderungen miteinander verkettet sind.

public void sendExample(Example example) { 
    WebResource webResource = this.client.resource(this.url); 
    Builder builder = webResource.type(MediaType.APPLICATION_JSON); 
    builder.accept(MediaType.APPLICATION_JSON); 
    builder.post(Example.class, example); 
    return; 
} 

Hier ist das gleiche Beispiel mit Verkettung. Es benutzt immer noch einen Builder, aber weniger offensichtlich.

public void sendExample(Example example) { 
    WebResource webResource = this.client.resource(this.url); 
    webResource.type(MediaType.APPLICATION_JSON) 
     .accept(MediaType.APPLICATION_JSON) 
     .post(Example.class, example); 
    return; 
} 
+0

Danke, das hat auch wie Charme funktioniert! – Perty

+0

Ich kann 'WebResource' Klasse nicht finden. Bitte gib den Importcode an! –

+0

Wenn Sie den 1.x-Zweig verwenden (das OP hat Version 1.12 angegeben), finden Sie Details zu WebResource hier: https://jersey.java.net/nonav/apidocs/1.9/jersey/com/sun/jersey /api/client/WebResource.html – phatfingers

Verwandte Themen