创建XSD并将其链接到WADL

时间:2011-05-29 15:28:27

标签: json xsd rpc jax-rs wadl

我正在使用JAX-RS创建一些服务,需要将任意复杂的对象作为参数,而不仅仅是整数和字符串等基元。 A discussion on the CXF mailing list说在这种情况下只使用包装器对象作为单个参数。

我关心的是如何记录服务的输入格式?如果创建的服务类似于以下内容:

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

CXF生成的自动生成的WADL只会产生以下内容:

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

这不包含有关请求或响应实际包含的内容的信息。 CXF邮件列表上的谢尔盖表示可以将模式链接到表示,但我该怎么做呢?我该如何创建XSD?

(PS对幂等资源使用POST可能不是RESTful,但这并不重要,因为我们实质上是在使用Json进行RPC。这或多或少是现有基于SOAP的API的1:1克隆。)

1 个答案:

答案 0 :(得分:6)

可以将XSD文件链接到WADL文件,然后在表示中引用请求和响应中的XML元素。但是,由于它是XML模式,因此它不适用于JSON表示。

要将XSD链接到WADL文件,请在主grammars元素之前的文件顶部创建一个resources元素。

<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作为稍后手动编辑的起点。