2011-11-22 22 views
8

Chúng tôi sử dụng Resteasy và gặp sự cố khi tìm cách gọi một số phương thức @GET.RestEasy có thể tuần tự hóa POJO cho phương thức @GET không?

Nếu giao diện cho phương thức chỉ có các thông số đơn giản, không có vấn đề gì. Ví dụ:

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

Nhưng nếu chúng ta cố gắng sử dụng POJO làm tham số, có vẻ như RestEasy không thể sắp xếp nó làm tham số chuỗi truy vấn. Ví dụ:

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

hoặc

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

(với, ParamPojo.java :)

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

Khi chúng tôi cố gắng này, đôi khi các dịch vụ này không được tìm thấy và đôi khi chúng ta có được một "A Yêu cầu GET không thể có nội dung. " ngoại lệ.

Sử dụng @POST chúng tôi có thể sử dụng POJO có tham số, nhưng một số phương pháp của chúng tôi không sửa đổi bất kỳ thứ gì trên máy chủ và do đó nên sử dụng @GET.

Cách giải quyết là "phát nổ" ParamPojo và sử dụng tất cả các thuộc tính của nó làm tham số riêng cho phương thức. Nhưng điều này loại bỏ phần "dễ dàng" của "RestEasy", phải không?

Trả lời

13

Bạn phải sử dụng chú thích @org.jboss.resteasy.annotations.Form trên thông số phương pháp của mình. http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html_single/#_Form

Ví dụ:

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

Cảm ơn eiden, nó đánh giá cao! – electrotype

+0

lưu ý rằng việc gửi dữ liệu trong các yêu cầu GET là chống lại triết lý REST, hãy xem câu trả lời "chính thức" từ Roy Fielding tại đây: http://stackoverflow.com/questions/978061/http-get-with-request-body/983458#983458 – Gregor

+0

@Gregor Ví dụ trên không gửi bất kỳ dữ liệu nào trong phần yêu cầu. – eiden

2

Đối với ràng buộc queryParam nhiều vào một đối tượng duy nhất chúng ta cần thêm @Form <POJO CLASS> như một đối số trong phương pháp phản ứng. Nó hoạt động tốt cho chúng ta. lớp

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

POJO nên chứa @QueryParam("") cho mỗi thuộc tính, ví dụ:

@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; 
} 
Các vấn đề liên quan