创建XSD并将其链接到WADL

oli*_*ren 5 rpc json xsd jax-rs wadl

我正在使用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
    ...
}
Run Code Online (Sandbox Code Playgroud)

CXF生成的自动生成的WADL只会产生以下结果:

<resource path="/oneParam">
   <method name="POST">
      <request>
            <representation mediaType="application/json"/>
      </request>
      <response>
             <representation mediaType="application/json"/>
       </response>
   </method>
</resource> 
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

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

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

<grammars>
    <include href="myapp.xsd"/>
</grammars>
Run Code Online (Sandbox Code Playgroud)

然后添加对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>
Run Code Online (Sandbox Code Playgroud)

前缀myapp在XSD中定义,也可以在WADL文件中使用.

我不知道要配置CXF来自动执行此操作.我与Jersey的经历类似,我们使用生成的WADL作为稍后手动编辑的起点.