我正在使用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克隆。)
答案 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作为稍后手动编辑的起点。