2011-05-29 103 views
5

我正在使用JAX-RS创建一些服务,这些服务需要将任意复杂的对象作为参数,而不仅仅是像整数和字符串这样的基本体。 A discussion on the CXF mailing list表示在这种情况下仅使用包装对象作为单个参数。创建XSD并将其链接到WADL

我的担心是如何记录服务的输入格式?如果创建一个看起来像下面这样的服务:

@POST 
@Produces("application/json") 
@Consumes("application/json") 
@Path("oneParam") 
public ComplexObject2 myServiceMethod(ComplexObject1 obj) { 
    Foo f = obj.foo 
    Bar b = obj.bar 
    ... 
} 

自动生成WADL是CXF生产只会产生如下:

<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克隆。)

+0

该模式旨在帮助开发人员找出发送和返回的内容,而不一定要验证计算机的输出。所以这适用于XML,而不是JSON对我来说并不重要。 – oligofren 2011-06-27 15:44:42

回答

6

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

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

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

+0

谢谢!我现在没有机会检查,但似乎只是我需要的东西。我不知道如何配置CXF,但生活找到了方法:) – oligofren 2011-06-27 15:43:02