Создать и связать XSD с WADL - PullRequest
5 голосов
/ 29 мая 2011

Я создаю некоторые сервисы, использующие 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
    ...
}

автоматически сгенерированный WADL, который производит CXF, выдаст только следующее:

<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, но здесь это не важно, поскольку мы, по сути, делаем RPC с использованием Json. Это более или менее клон 1: 1 существующего API на основе SOAP.)

1 Ответ

6 голосов
/ 25 июня 2011

Можно связать файл 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 для этого автоматически. Мой опыт работы с Джерси аналогичен, и мы используем сгенерированный WADL в качестве отправной точки для последующего редактирования вручную.

...