问题描述
|
我正在使用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?
(P.S.使用POST来获得幂等资源可能不是RESTful的,但这在这里并不重要,因为我们本质上是使用Json进行RPC。这或多或少是现有基于SOAP的api的1:1克隆。)
解决方法
可以将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>
前缀“ 6”在XSD中定义,也可以在WADL文件中使用。
我不知道将CXF配置为自动执行此操作。我对Jersey的经验与之类似,我们将生成的WADL用作以后进行手动编辑的起点。