2010-04-23 32 views
26

Tôi có một nguồn tài nguyên JAX-RS, mà được paramaters của nó như là một chuỗi JSON như thế này:Chuyển đổi JSON tham số truy vấn các đối tượng với JAX-RS

http://some.test/aresource?query={"paramA":"value1", "paramB":"value2"} 

Lý do để sử dụng JSON ở đây, là các truy vấn đối tượng có thể khá phức tạp trong các trường hợp sử dụng thực tế.

Tôi muốn chuyển đổi chuỗi JSON để một đối tượng Java, dto trong ví dụ:

@GET 
@Produces("text/plain") 
public String getIt(@QueryParam("query") DataTransferObject dto) { 
    ... 
} 

Liệu JAX-RS hỗ trợ chuyển đổi như vậy từ JSON thông qua như là một tham số truy vấn các đối tượng Java?

Trả lời

15

Có, bạn có thể làm điều này, nhưng bạn sẽ cần tự viết mã chuyển đổi. May mắn thay, điều này rất dễ, bạn chỉ cần viết một lớp có một hàm tạo công khai String để thực hiện chuyển đổi. Ví dụ:

public class JSONParam { 
    private DataTransferObject dto; 

    public JSONParam(String json) throws WebApplicationException { 
     try { 
      // convert json string DataTransferObject and set dto 
     } 
     catch (JSONException e) { 
      throw new WebApplicationException(Response.status(Status.BAD_REQUEST) 
        .entity("Couldn't parse JSON string: " + e.getMessage()) 
        .build()); 
     } 
    } 

    public DataTransferObject getDTO() { 
     return dto; 
    } 
} 

Sau đó, bạn có thể sử dụng:

@GET 
@Produces("text/plain") 
public String getIt(@QueryParam("query") JSONParam json) { 
    DataTransferObject dto = json.getDTO(); 
    ... 
} 
+4

Vì tất cả có vẻ là 'JSONParam' không là quấn 'DataTransferObject' và sử dụng một chuỗi nhà xây dựng dựa ... sẽ có thể chỉ cần thêm một hàm dựng String dựa vào 'DataTransferObject'? – hypno7oad

8

Thêm vào giải pháp của Jason, sử dụng http://www.json.org/java/ (biếu không của Crockford):

import org.json.JSONObject; 

public class JSONParam { 
    private DataTransferObject dto; 

    public JSONParam(String json) throws WebApplicationException { 
     try { 
      // convert json string DataTransferObject and set dto 
      JSONObject jo = new JSONObject(json); 
      dto.setParamA(jo.getString("paramA")); 
      dto.setParamB(jo.getString("paramB")); 
      // There are other get methods for Integer, Double, etc. 
      // You can also build JSON from Java objects. 
     } 
     catch (JSONException e) { 
      throw new WebApplicationException(Response.status(Status.BAD_REQUEST) 
        .entity("Couldn't parse JSON string: " + e.getMessage()) 
        .build()); 
     } 
    } 

    public DataTransferObject getDTO() { 
     return dto; 
    }     
} 

Đừng tái phát minh ra bánh xe :-)

+0

Nếu bạn không truyền đối tượng JSON của mình qua tham số, bạn không thể sử dụng giải pháp này. Nhưng bạn có thể sử dụng phiên bản mà lili đang đề xuất ([lili] (http://stackoverflow.com/a/6250744/853510)) –

11

Như đã đề cập, bạn cần chuyển đổi rõ ràng từ tham số Chuỗi thành JSON. Nhưng không cần phải sử dụng thứ gì đó nguyên thủy như trình phân tích cú pháp của org.json; Jackson hoặc Gson có thể làm ràng buộc dữ liệu (Chuỗi thành JSON, JSON thành POJO) trong một hoặc hai dòng. Với Jackson:

MyValue value = new ObjectMapper().readValue(json, MyValue.class); 

(cho mã sản xuất, chỉ cần tạo ObjectMapper thành viên một lần như tĩnh, tái sử dụng)

Jackson là điều mà hầu hết JAX-RS triển khai sử dụng để thực hiện liên kết dữ liệu cho dữ liệu POST, vì vậy đây là khá giống nhau.

0

Nếu bạn quan tâm đến việc tạo DTO, tôi có thể đề xuất jsonschema2pojo không? Bạn có thể xác định các đối tượng của mình bằng cách sử dụng JSON Schema và DTO được tạo tự động.

Khi bạn đã viết giản đồ, bạn cũng có thể cung cấp cho người tiêu dùng để họ hiểu chính xác cách yêu cầu phải được định dạng.

4

JAX-RS hỗ trợ việc sử dụng JAXB (Java API cho XML Binding) để liên kết JavaBean với XML hoặc JSON và ngược lại. Thông tin chi tiết có thể được tìm thấy ở đây, ví dụ: http://www.ibm.com/developerworks/web/library/wa-aj-tomcat/index.html

Bạn cần phải

  • Thêm chú thích @XmlRootElement trên DataTransferObject
  • Tạo cho nó một constructor mặc định trống trong DataTransferObject
  • Thêm @Consumes (MediaType.APPLICATION_JSON) chú thích để WebService
+0

Nếu bạn cần một ví dụ, hãy xem [https://blogs.oracle.com/enterprisetechtips /entry/configuring_json_for_restful_web](https://blogs.oracle.com/enterprisetechtips/entry/configuring_json_for_restful_web) tìm StatusInfoBean. –

Các vấn đề liên quan