2011-05-29 97 views
5

我正在使用JAX-RS創建一些服務,這些服務需要將任意複雜的對象作爲參數,而不僅僅是像整數和字符串這樣的基本體。 A discussion on the CXF mailing list表示在這種情況下僅使用包裝對象作爲單個參數。創建XSD並將其鏈接到WADL

我的擔心是如何記錄服務的輸入格式?如果創建一個看起來像下面這樣的服務:

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

自動生成WADL是CXF生產只會產生如下:

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

這其中包含請求或響應實際上什麼都沒信息包含的內容。 CXF郵件列表中的Sergey表示可以將模式鏈接到該表示,但我該怎麼做呢?我如何創建XSD?

(PS對於冪等資源使用POST可能不是RESTful,但這裏並不重要,因爲我們本質上是使用Json來執行RPC,這或多或少是現有基於SOAP的api的1:1克隆。)

+0

該模式旨在幫助開發人員找出發送和返回的內容,而不一定要驗證計算機的輸出。所以這適用於XML,而不是JSON對我來說並不重要。 – oligofren 2011-06-27 15:44:42

回答

6

可以將XSD文件鏈接到WADL文件中,然後在請求和響應的表示中引用XML元素。但是,由於它是XML模式,因此它不適用於JSON表示。

要將XSD鏈接到WADL文件,請在主要resources元素之前的文件頂部創建一個grammars元素。

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

接着的引用添加到一個XML元素如下(使用實施例的修改版本):

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

前綴myapp在XSD定義,並且可以在WADL文件中使用以及。

我不知道要配置CXF自動執行此操作。我對Jersey的使用經歷很相似,我們將生成的WADL作爲稍後手動編輯的起點。

+0

謝謝!我現在沒有機會檢查,但似乎只是我需要的東西。我不知道如何配置CXF,但生活找到了方法:) – oligofren 2011-06-27 15:43:02