2011-05-29 10 views
5

Tworzę niektóre usługi za pomocą JAX-RS, które muszą przyjmować dowolnie złożone obiekty jako argumenty, a nie tylko prymitywy, takie jak liczby całkowite i ciągi. A discussion on the CXF mailing list mówi, aby w tym przypadku użyć tylko obiektu opakowującego jako pojedynczego parametru.Tworzenie i łączenie XSD z WADL

Mój problem polega na udokumentowaniu formatu wejściowego usługi? Jeśli stworzenie usługi, która wygląda mniej więcej tak:

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

auto generowane WADL że CXF produkuje tylko produkować następujące:

<resource path="/oneParam"> 
    <method name="POST"> 
     <request> 
      <representation mediaType="application/json"/> 
     </request> 
     <response> 
      <representation mediaType="application/json"/> 
     </response> 
    </method> 
</resource> 

ten nie zawiera informacji na temat tego, co wniosek lub odpowiedź faktycznie zawiera. Sergey na liście mailingowej CXF powiedział, że możliwe jest połączenie schematu z reprezentacją, ale jak mam to zrobić? I jak utworzyć XSD?

(PS Używanie testu POST dla zasobów idempotentnych może nie być RESTful, ale nie ma tu znaczenia, ponieważ w istocie robimy RPC, używając Json, to jest mniej więcej klon 1: 1 istniejącego interfejsu API opartego na protokole SOAP.)

+0

Schemat ma pomóc programistom dowiedzieć się, co jest wysyłane i zwracane, niekoniecznie do sprawdzania poprawności danych wyjściowych urządzenia. Tak, to dotyczy xml, a nie json nie jest dla mnie tak ważne. – oligofren

Odpowiedz

6

Możliwe jest powiązanie pliku XSD z plikiem WADL, a następnie odniesienie do elementu XML w reprezentacji dla żądań i odpowiedzi. Jednak ponieważ jest to schemat XML, nie ma zastosowania do reprezentacji JSON.

Aby połączyć XSD z plikiem WADL, utwórz element grammars na górze pliku przed głównym elementem resources.

<grammars> 
    <include href="myapp.xsd"/> 
</grammars> 

Następnie dodać odwołanie do elementu XML w następujący sposób (stosując zmodyfikowaną wersję swojego przykład):

<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> 

Przedrostek myapp zdefiniowaną w XSD i może być używany w pliku WADL także.

Nie wiem, jak skonfigurować CXF, aby to zrobić automatycznie. Moje doświadczenia z Jersey są podobne i używamy wygenerowanego WADL jako punktu wyjścia do ręcznej edycji później.

+0

Dzięki! Nie mam teraz szansy, żeby to sprawdzić, ale wygląda na to, że potrzebuję tego. Nie mam pojęcia, jak skonfigurować CXF, ale życie znajdzie sposób :) – oligofren