5

我正在使用 JAX-RS 创建一些服务,这些服务需要将任意复杂的对象作为参数,而不仅仅是整数和字符串等原语。CXF 邮件列表上的讨论说在这种情况下只使用包装器对象作为单个参数。

我关心的是如何记录服务的输入格式?如果创建如下所示的服务:

@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 邮件列表上的 Sergey 说可以将模式链接到表示,但我应该怎么做呢?以及如何创建 XSD?

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

4

1 回答 1

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

于 2011-06-25T10:01:32.267 回答