2011-11-22 9 views
8

Używamy Resteasy i mamy problem z określeniem sposobu wywoływania niektórych metod @GET.Czy RestEasy może serializować POJO dla metody @GET?

Jeśli interfejs metody ma tylko proste parametry, nie ma problemu. Ex:

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

Ale jeśli spróbujemy użyć POJO jako parametr wydaje RestEasy nie jest w stanie szeregować je jako parametry kwerendy. Ex:

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

lub

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

(z, ParamPojo.java :)

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

Kiedy próbujemy to czasami usługi są nie znaleziono, a czasami otrzymujemy „A Żądanie GET nie może mieć ciała. " wyjątek.

Używając @POST możemy używać POJO ma parametr, ale niektóre z naszych metod nie modyfikują niczego na serwerze, dlatego powinny używać @GET.

Obejście polega na "wybuchnięciu" ParamPojo i wykorzystaniu wszystkich jego właściwości jako oddzielnych parametrów dla metody. Ale to usuwa "łatwą" część "RestEasy", prawda?

Odpowiedz

13

Musisz użyć adnotacji @org.jboss.resteasy.annotations.Form na parametrze method. http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html_single/#_Form

przykład:

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

Dzięki Eiden, to mile widziana! – electrotype

+0

Należy pamiętać, że wysyłanie danych w żądaniach GET jest niezgodne z filozofią REST, patrz "oficjalna" odpowiedź od Roy Fielding tutaj: http://stackoverflow.com/questions/978061/http-get-with-request-body/983458#983458 – Gregor

+0

@Gregor Powyższy przykład nie wysyła żadnych danych w treści żądania. – eiden

2

do wiązania wielu queryParam do pojedynczego obiektu trzeba dodać @Form <POJO CLASS> jako argumenty sposobu reakcji. Działa to dobrze dla nas. Klasa

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

POJO powinna zawierać @QueryParam("") dla każdego atrybutów, na przykład:

@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; 
} 
Powiązane problemy