2010-02-05 8 views
29

Wir verwenden den "Start from Java" -Ansatz zum Erstellen von JAX-WS 2.0-Webdiensten mit dem Metro 1.5-Stack. Wenn wir ein Standardwerkzeug wie SoapUI auf einen unserer Webdienste verweisen, zeigt dies an, dass Parameter für WebMethods optional sind. Das generierte xsd zeigt minOccurs = 0 an.Wie kann ich einen WebMethod-Parameter erforderlich machen?

Ich brauche einen Weg, um WebMethod Parameter erforderlich zu machen (vielleicht minOccurs = 1 in der xsd) in der "Start von Java" -Ansatz. Ich würde denken, dass es eine Java Annotation dafür gibt, aber ich konnte keine finden. Die XmlElement-Annotation hat ein erforderliches Attribut, aber XmlElement kann nicht auf WebMethod-Parameter angewendet werden.

Gibt es eine Möglichkeit, meine WebMethod-Parameter erforderlich zu machen, ohne die xsd manuell zu bearbeiten und minOccurs auf 1 zu setzen?

Antwort

28

Ich habe überprüft, dass Metro 2.0 erlaubt Ihnen, @XmlElement(required=true) auf einen Parameter einzustellen. Das generierte xsd hat minOccurs=0 nicht. Es lässt minOccurs aus dem erzeugten XSD, so dass es den Standardwert von 1.

geht davon aus Sie müssen auch Ihre JDK-Upgrade durch die JAX-WS 2.2 webservices-api.jar im endorsed/ Verzeichnis setzen.

Ich veröffentlichte die gleiche Frage on the Java forums.

Dank jitu sowohl für die Antwort als auch darauf, dass minOccurs standardmäßig auf 1 setzt, so dass es aus der .xsd hat den gewünschten Effekt.

Wenn @XmlElement (required = true) für den Parameter SoapUI festgelegt ist, wird dieser Parameter nicht mehr als optional angezeigt.

6

Das generierte xsd zeigt minOccurs = 0.

Dies ist pro Spezifikation: Alle Nicht-Primitiven sind optional, nur Primitive sind erforderlich.

Ich brauche einen Weg, um WebMethod Parameter erforderlich zu machen (vielleicht minOccurs = 1 in der xsd) in der "Start von Java" -Ansatz.

Dies ist nicht möglich, es sei denn, Sie verwenden Primitive wie zuvor erwähnt.

Und eigentlich ist dies einer der Gründe, warum Java zuerst saugt (ja, Entwickler mögen es aber it just does not work): es ist fragil, der Vertrag kann sich ändern (!), Es gibt Ihnen nicht die ganze Kontrolle, die Sie brauchen es tut nicht fit well with WS-Security, etc. So, in der Tat, contract-first ist nicht angenehm, aber zumindest funktioniert es.

+0

Danke für die Kommentare und die Links. Ich wünsche diesen aufgeblähten Web-Services-Büchern da draußen (von denen ich einige gelesen habe - ich meine, durchwaten) hätte ich das genauso klar gesagt wie Sie. –

+0

@Dean du bist willkommen. Und danke für das Feedback zu JAX-WS 2.2 (auch wenn das nicht wirklich im Rahmen der Ausgangsfrage lag). –

+2

Ich würde sagen, dass WSDL-First gleichermaßen nicht funktioniert. Der Blog, den Sie verlinken, redet über die Verwendung komplexer Request- und Return-Objekte zum Wrapping, aber dies bringt eine Reihe von Problemen mit sich, wie zum Beispiel das Verstecken der benötigten Dinge in den zugrunde liegenden Feldern, Missbrauch der Wiederverwendung, etc ... Beispiel für etwas, das gut ist, Spring und Proxies zu benutzen, um etwas wie einen WebService als einfache Implementierung einer Schnittstelle lokal erscheinen zu lassen. Das Aufkleben Ihrer lokalen Schnittstelle auf diese Weise ist Teil dessen, was Sie davon abhält zu vergessen, dass es sich um einen Dienst handelt, der über JAX-WS verfügbar gemacht wird. – jcalvert

2

Hier ist eine weitere Diskussion der gleichen Frage. Entsprechend der Antwort unterstützt Metro 2.0 das Setzen von @XmlElement auf einen Methodenparameter, der mein Problem lösen sollte.

http://forums.java.net/jive/thread.jspa?messageID=385565&#385565

Metro 2.0 wurde am 10. Dezember veröffentlicht 2009, so ist es nicht mehr in EA. Ich werde es versuchen und sehen, ob es funktioniert.

Verwandte Themen