2011-11-22 11 views
8

Resteasyを使用していて、@GETメソッドを呼び出す方法がわかりません。簡単に@GETメソッドのPOJOをシリアル化できますか?

メソッドのインターフェイスに単純なパラメータしかない場合は問題ありません。例:

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

しかし、我々は、パラメータとしてPOJOを使用しようとすると、それはそうRESTEasyはクエリ文字列パラメータとしてそれをシリアル化することができません。例:私たちはこれをしようとすると

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

または

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

(ParamPojo.java、と:)

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

、時々サービスが見つからないと、時々、私たちは、「Aを取得しますGETリクエストはボディを持つことはできません。例外。

@POSTを使用すると、パラメータを持つPOJOを使用できますが、メソッドの中にはサーバー上の何も変更しないため、@ GETを使用する必要があります。

回避策は、ParamPojoを「分解」し、すべてのプロパティをメソッドの分離パラメータとして使用することです。しかし、これは "RestEasy"の "Easy"部分を削除しますか?

答えて

13

メソッドパラメータに@org.jboss.resteasy.annotations.Formアノテーションを使用する必要があります。 http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html_single/#_Form

例:私たちは応答方式では、引数として@Form <POJO CLASS>を追加する必要がある1つのオブジェクトに複数のqueryParamを結合するための

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

おかげエイデン、当然のです! – electrotype

+0

GETリクエストでデータを送信することは、REST哲学に反することに注意してください。ロイ・フィールディングの「公式」回答を参照してください:http://stackoverflow.com/questions/978061/http-get-with-request-body/983458#983458 – Gregor

+0

@Gregor上記の例では、要求本体にデータは送信されません。 – eiden

2

。それは私たちのために正常に動作します。

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

POJOクラスは、例えば、すべての属性の@QueryParam("")が含まれている必要があります

@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; 
} 
関連する問題