2012-04-26 43 views
8

que tienen un servicio de JSON de trabajo que se parece a esto:¿Cómo PUESTO un Pojo con Jersey Client sin convertir manualmente a JSON?

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

El objeto de consulta se parece a esto y al publicar una representación JSON de ese objeto de consulta que funciona bien.

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

Ahora quiero llenar ese objeto desde un cliente y utilizar el cliente Jersey para publicar ese objeto de consultas para el servicio y obtener un JSONObject como resultado. Tengo entendido que se podría hacer sin convertirlo primero en un objeto json y luego publicarlo como una cadena.

He intentado algo como esto, pero creo que extraño algo.

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; 
} 

Estoy usando Jersey 1.12.

Cualquier ayuda o puntero en la dirección correcta sería muy apreciada.

Respuesta

3

Si el servicio web produce un JSON debe controlar que en su cliente mediante el uso de un método accept():

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

probar esto y dar a sus resultados.

+1

¡Gracias! Me pusiste en el camino correcto con ClientResponse. Tuve que hacer algunas cosas adicionales también: 'WebResource webResource = client.resource (url); ClientResponse response = webResource.type (MediaType.APPLICATION_JSON_TYPE) .accept (MediaType.APPLICATION_JSON) .post (ClientResponse.class, searchQuery); ListWrapper listWrapper = response.getEntity (ListWrapper.class); ' Ahora tengo una JsonMappingException, pero creo que es un error en el resultado json. – Perty

+0

Lo siento mi marcado: -/ – Perty

5

El método WebResource.entity (...) no altera su instancia de webResource ... crea y devuelve un objeto de generador que contiene el cambio. Su llamada a .post normalmente se realiza desde un objeto Builder en lugar de desde el objeto WebResource. Esa transición se oscurece fácilmente cuando todas las solicitudes se encadenan juntas.

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; 
} 

Aquí está el mismo ejemplo que utiliza el encadenamiento. Todavía está usando un generador, pero menos obviamente.

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

¡Gracias, eso también funcionó como el encanto! – Perty

+0

No encuentro la clase 'WebResource'. Por favor, da el código de importación! –

+0

Si está utilizando la rama 1.x (la versión especificada OP 1.12), puede encontrar detalles en WebResource aquí: https://jersey.java.net/nonav/apidocs/1.9/jersey/com/sun/jersey /api/client/WebResource.html – phatfingers

Cuestiones relacionadas