2012-04-26 13 views
8

Tôi có một dịch vụ json làm việc đó trông như thế này:Làm cách nào để đăng một Pojo bằng ứng dụng khách của Jersey mà không cần chuyển đổi sang JSON theo cách thủ công?

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

Đối tượng truy vấn trông như thế này và khi đăng một đại diện json của đối tượng Query nó hoạt động ra tốt đẹp.

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

Bây giờ tôi muốn điền đối tượng đó từ ứng dụng khách và sử dụng ứng dụng khách Jersey để đăng đối tượng truy vấn đó lên dịch vụ và nhận kết quả JSONObject. Sự hiểu biết của tôi là nó có thể được thực hiện mà không cần chuyển đổi nó thành một đối tượng json đầu tiên và sau đó được đăng dưới dạng một String.

Tôi đã thử một cái gì đó như thế này nhưng tôi nghĩ rằng tôi bỏ lỡ một cái gì đó.

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

Tôi đang sử dụng Jersey 1.12.

Bất kỳ trợ giúp hoặc con trỏ nào đi đúng hướng sẽ được đánh giá cao.

Trả lời

3

Nếu web-dịch vụ của bạn tạo ra một JSON bạn phải xử lý đó trong ứng dụng của bạn bằng cách sử dụng một phương pháp accept():

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

Hãy thử điều này và đưa ra kết quả của bạn.

+1

Cảm ơn bạn! Bạn đã giúp tôi đi đúng hướng với ClientResponse. Tôi cũng phải thực hiện một số nội dung bổ sung: 'WebResource webResource = client.resource (url); Phản hồi của ClientResponse = webResource.type (MediaType.APPLICATION_JSON_TYPE) .accept (MediaType.APPLICATION_JSON) .post (ClientResponse.class, searchQuery); ListWrapper listWrapper = response.getEntity (ListWrapper.class); ' Bây giờ tôi có một JsonMappingException, nhưng tôi nghĩ rằng đó là một lỗi trong kết quả json. – Perty

+0

Xin lỗi đánh dấu của tôi: -/ – Perty

5

Phương thức WebResource.entity (...) không thay đổi cá thể webResource của bạn ... nó tạo và trả về đối tượng Trình tạo giữ thay đổi. Cuộc gọi của bạn tới .post thường được thực hiện từ đối tượng Builder thay vì từ đối tượng WebResource. Sự chuyển đổi đó dễ bị che khuất khi tất cả các yêu cầu được xích lại với nhau.

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

Đây là ví dụ tương tự bằng cách sử dụng chuỗi. Nó vẫn còn sử dụng một Builder, nhưng ít rõ ràng hơn.

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

Cảm ơn, điều đó cũng hoạt động như sự quyến rũ! – Perty

+0

Tôi không thể tìm thấy lớp 'WebResource'. Vui lòng cung cấp mã nhập! –

+0

Nếu bạn đang sử dụng nhánh 1.x (phiên bản OP được chỉ định 1.12), bạn có thể tìm thấy chi tiết về WebResource tại đây: https://jersey.java.net/nonav/apidocs/1.9/jersey/com/sun/jersey /api/client/WebResource.html – phatfingers