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