2011-11-22 15 views
8

Utilizamos Resteasy y tenemos problemas para calcular cómo llamar a algunos métodos @GET.¿Puede RestEasy serializar un POJO para un método @GET?

Si la interfaz para el método sólo tiene parámetros simples, no hay ningún problema. Ej:

@GET 
@Path("/test/{myparam}") 
public FacetQueryResultImpl testMethod(@PathParam("myparam")String myparam); 

Pero si tratamos de utilizar un POJO como parámetro, parece RestEasy no es capaz de serializarlo como parámetros de cadena de consulta. Ej:

@GET 
@Path("/testGet") 
public FacetQueryResultImpl testMethod(ParamPojo myparam); 

o

@GET 
@Path("/testGet") 
public FacetQueryResultImpl testMethod(@QueryParam("myparam")ParamPojo myparam); 

(con, ParamPojo.java :)

public class ParamPojo 
{ 
    private String name; 
    private String description; 
    (...) 
} 

Cuando tratamos esto, a veces los servicios no se encuentran y, a veces se obtiene un "Un La solicitud GET no puede tener un cuerpo ". excepción.

Usando @POST que son capaces de utilizar un POJO tiene el parámetro, pero algunos de nuestros métodos no modifican nada en el servidor, y por lo tanto debe utilizar @GET.

Una solución consiste en "explotar" la ParamPojo, y utilizar todas sus propiedades como parámetros separados para el método. Pero esto elimina la parte "Fácil" de "RestEasy", ¿no es así?

Respuesta

13

debe utilizar la anotación @org.jboss.resteasy.annotations.Form en su parámetro de método. http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html_single/#_Form

Ejemplo:

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.QueryParam; 

import junit.framework.Assert; 

import org.jboss.resteasy.annotations.Form; 
import org.jboss.resteasy.core.Dispatcher; 
import org.jboss.resteasy.mock.MockDispatcherFactory; 
import org.jboss.resteasy.mock.MockHttpRequest; 
import org.jboss.resteasy.mock.MockHttpResponse; 
import org.junit.Test; 

public class TestCase { 
    @Path("/") 
    public static class Service { 

     @Path("") 
     @GET 
     public String get(@Form ValueObject vo){ 
      return vo.getParam(); 
     } 
    } 

    public static class ValueObject { 
     @QueryParam("myparam") 
     private String param; 

     public String getParam() { 
      return param; 
     } 
    } 

    @Test 
    public void test() throws Exception { 
     Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); 
     dispatcher.getRegistry().addSingletonResource(new Service()); 

     MockHttpRequest request = MockHttpRequest.get("/?myparam=somevalue"); 
     MockHttpResponse response = new MockHttpResponse(); 

     dispatcher.invoke(request, response); 

     Assert.assertEquals("somevalue", response.getContentAsString()); 
    } 
} 
+1

Gracias Eiden, es apreciada! – electrotype

+0

tenga en cuenta que el envío de datos en las solicitudes GET va en contra de la filosofía REST, consulte la respuesta "oficial" de Roy Fielding aquí: http://stackoverflow.com/questions/978061/http-get-with-request-body/983458#983458 – Gregor

+0

@Gregor El ejemplo anterior no envía ningún dato en el cuerpo de la solicitud. – eiden

2

Para la unión del queryParam múltiple en un solo objeto tenemos que añadir @Form <POJO CLASS> como argumentos en método de respuesta. Funciona bien para nosotros. clase

@GET  
@Path("/") 
@Produces("application/json") 
@Consumes("application/json") 
public Response search(@Form CatalogSearchRequest reqObject) { 
    System.out.println("Entered into service" + reqObject.getAttribute()); 
} 

POJO debe contener @QueryParam("") por cada atributos, por ejemplo:

@QueryParam("pageSize") 
public Integer pageSize; 

@QueryParam("page") 
public Integer page; 

public Integer getPageSize() { 
    return pageSize; 
} 

public void setPageSize(Integer pageSize) { 
    this.pageSize = pageSize; 
} 

public Integer getPage() { 
    return page; 
} 

public void setPage(Integer page) { 
    this.page = page; 
} 
Cuestiones relacionadas