Ich kämpfe für ein paar Tage jetzt mit dem folgenden Problem. Ich habe ziemlich viel nach einer Antwort gesucht, hier in SO, in Jersey-Mailinglisten und dem Netz im Allgemeinen, aber ich war nicht in der Lage, eine Antwort auf diese spezielle Frage zu finden.Generierte WADL für eine Liste von Ressourcen
das Problem Domain einrichten ...
Ich verwende Jersey 1,16 innerhalb Tomcat 7.
Ich habe eine einfache JAX-RS-Ressource erstellt wie folgt aussehen:
@Path("/")
@Produces({ "application/xml", "text/plain" })
public class ExampleResource {
@GET
public List<Thing> getThings() {
List<Thing> list = new ArrayList<>();
list.add(new Thing("a thing 1", "a thing description 1"));
list.add(new Thing("a thing 2", "a thing description 2"));
return list;
}
}
Thing
ist ein mit JAXB annotierter POJO, der wie folgt aussieht
@XmlRootElement(name = "thing")
public class Thing {
private String name;
private String description;
// getters, setters and @XmlElement annotations ommited for brevity
Ich habe auch WadlGeneratorJAXBGrammarGenerator.class
konfiguriert Und wenn ich für GET http://localhost:8092/rest
fragen funktioniert es wie ein Zauber - schön formatierte Sammlung von Thing
zurückgegeben.
Die automatisch generierte WADL http://localhost:8092/rest/application.wadl
ist fast perfekt, es sieht wie folgt aus:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
<doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 1.16 11/28/2012 02:09 PM" />
<grammars>
<include href="application.wadl/xsd0.xsd">
<doc title="Generated" xml:lang="en" />
</include>
</grammars>
<resources base="http://localhost:8092/rest/">
<resource path="/">
<method id="getThings" name="GET">
<response>
<ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02"
xmlns="" element="thing" mediaType="application/xml" />
<representation mediaType="text/plain" />
</response>
</method>
</resource>
</resources>
</application>
Wie ich schon sagte, fast perfekt, und darin liegt das Problem.
<ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02"
xmlns="" element="thing" mediaType="application/xml" />
Die WADL beschreibt, ist nicht, dass /getThings
eine List<Thing>
zurückgibt. Es sieht eher so aus, als ob es sich auf ein einzelnes Element thing
in der xsd0.xsd
bezieht. Also, wenn ich es z. wadl2java, generiert es untypisierte Client. Um ein List<Thing>
ich manuell codieren, es zu bekommen, so etwas wie
List<Thing> asXml = root().getAsXml(new GenericType<List<Thing>>(){});
Weiß jemand, ob es möglich ist, die automatische WADL Generation zu haben, die irgendwie zeigen würden, dass diese bestimmte Ressource eine Liste zurückkehrt von Ressourcen eines bestimmten Typs?
Und ich nicht möchte zusätzliche "ThingList" JAXB-annotierte Klasse erstellen und diese stattdessen in meinem Jersey Ressource zurückgeben.
ich fast da bin mit dem „perfekten“ WADL zu erzeugen, ist es gerade dieses (hoffentlich) kleine Stück, das ich fehle ...
Vielen Dank!
ich mit WADL nicht allzu vertraut bin, aber, was (XML) Wert für diese Linie optimal wäre Sie zitiert? In wsdls werden Listen und einfache Objekte fast auf die gleiche Weise dargestellt. – acdcjunior
Es kam mir nicht in den Sinn, mich mit WSDL zu vergleichen, da ich fast keine Erfahrung damit habe. Du hast also einen guten Punkt. Wie das aussehen soll, darüber bin ich mir auch nicht so sicher. Können Sie vielleicht ein Beispiel geben, wie es in WSDL aussehen würde? – Svilen
In einer WSDL wird eine Entität (z. B. "Person") zu einem "xs: complexType" mit einem Element für jede Eigenschaft, die sie hat. Eine Eigenschaft, etwa 'String name', sieht wie folgt aus: ' (die 'minOccurs = '0'' impliziert, dass dies ein optionales Feld ist). Eine Eigenschaft, die eine Liste ist, sagen 'String [] Nicknames' würde etwa so aussehen: ' '. Wie Sie sehen können, ist der einzige Unterschied von einem einfachen Feld zu einer Liste 'maxOccurs =' unbounded '. –
acdcjunior