2011-05-29 40 views
5

Tôi đang tạo một số dịch vụ bằng cách sử dụng JAX-RS cần phải thực hiện các đối tượng phức tạp tùy ý, không chỉ nguyên thủy như số nguyên và chuỗi. A discussion on the CXF mailing list nói rằng chỉ cần sử dụng một đối tượng bao bọc như một tham số duy nhất trong trường hợp này.Tạo và liên kết XSD với WADL

Mối quan tâm của tôi là cách ghi lại định dạng đầu vào cho dịch vụ? Nếu tạo ra một dịch vụ mà trông giống như sau:

@POST 
@Produces("application/json") 
@Consumes("application/json") 
@Path("oneParam") 
public ComplexObject2 myServiceMethod(ComplexObject1 obj) { 
    Foo f = obj.foo 
    Bar b = obj.bar 
    ... 
} 

tự động tạo ra WADL rằng CXF sản xuất sẽ chỉ sản xuất như sau:

<resource path="/oneParam"> 
    <method name="POST"> 
     <request> 
      <representation mediaType="application/json"/> 
     </request> 
     <response> 
      <representation mediaType="application/json"/> 
     </response> 
    </method> 
</resource> 

này không chứa thông tin về những yêu cầu hoặc phản ứng thực sự chứa đựng. Sergey trên danh sách gửi thư của CXF cho biết có thể liên kết một lược đồ với đại diện, nhưng tôi phải làm như thế nào? Và làm cách nào để tạo XSD?

(PS Sử dụng POST cho tài nguyên idempotent có thể không được RESTful, nhưng điều này không quan trọng ở đây vì chúng tôi đang làm RPC bằng Json. Đây là bản sao 1: 1 của api dựa trên SOAP hiện có)

+0

Giản đồ này là để giúp các nhà phát triển tìm hiểu những gì được gửi và trả lại, không nhất thiết phải xác thực đầu ra của một máy. Vì vậy, đó là áp dụng cho xml và không json không phải là quan trọng với tôi. – oligofren

Trả lời

6

Có thể liên kết tệp XSD thành tệp WADL và sau đó tham chiếu một phần tử XML trong biểu diễn cho các yêu cầu và phản hồi. Tuy nhiên, vì nó là lược đồ XML, nó không áp dụng cho các biểu diễn JSON.

Để liên kết XSD vào tệp WADL, hãy tạo phần tử grammars ở đầu tệp trước phần tử chính resources.

<grammars> 
    <include href="myapp.xsd"/> 
</grammars> 

Sau đó thêm một tham chiếu đến một phần tử XML như sau (sử dụng một phiên bản sửa đổi của các ví dụ của bạn):

<resource path="/oneParam"> 
    <method name="POST"> 
     <request> 
      <representation mediaType="application/xml" element="myapp:oneParamRequest" /> 
     </request> 
     <response> 
      <representation mediaType="application/xml" element="myapp:oneParamResponse" /> 
     </response> 
    </method> 
</resource> 

Tiền tố myapp được định nghĩa trong XSD và có thể được sử dụng trong các tập tin WADL cũng.

Tôi không biết định cấu hình CXF để thực hiện điều này tự động. Kinh nghiệm của tôi với Jersey là tương tự và chúng tôi sử dụng WADL được tạo ra làm điểm bắt đầu để chỉnh sửa bằng tay sau này.

+0

Cảm ơn! Tôi không có cơ hội để kiểm tra điều đó ngay bây giờ, nhưng có vẻ như đó là điều tôi cần. Tôi không có ý tưởng về cách cấu hình CXF, nhưng cuộc sống tìm thấy một cách :) – oligofren

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