Wie man Kontrolle über JAXBContext in JAX-WS?
Ich bereitstellen müssen, die den gleichen web-service für jeden Kunden. Diese @javax.jws.WebService
verwendet Object
Methoden-Argumente und Rückgabetypen (was <xs:anyType/>
im wsdl). Jede Instanz von web-service bereitgestellt wird, zusammen mit Kunden jar im classpath. Diese jar-Datei hat die bekannte Struktur und enthält JAXB-annotierten Klassen, die Kunde will zu Griff über meinen service.
Das problem ist, dass wenn der Kunde übergibt eine Instanz seiner Klasse als Methode agrument, server-side-JAXB-Kontext unmarshals es in einige seltsame xerces dom Knotens, da (wie ich es verstehe), das während der Bereitstellung Zeit nur @WebMethod
und @WebService
Anmerkungen wurden gescannt, die, wie bereits gesagt, sind alle den Umgang mit Object
nur.
Einfach gesagt, ich brauche, um anzudeuten, JAXB bei WEB-INF/lib/customer_classes_14586.jar
was bedeutet, dass eine gewisse Kontrolle über JAXBContext
- Erzeugung während des JAX-WS-Implementierung.
Ist es überhaupt möglich?
Server-spezifische Lösungen sind in Ordnung (glassfish 3.1 mit U-ws-stack)
UPDATE
Ich vermisst habe, eine Sache, die wichtig sein könnte: ich bereitstellen dieser web-services als OSGI-bundles zur Laufzeit via web-admin-Konsole. Wenn ich drücken Sie die Schaltfläche deploy neue jar-Datei ist programmatisch aufgebaut, die von Kunden der Bibliothek, webservice-Klasse, wsdl und manifestiert. Also ich könnte stören im build-Prozess und geben Hinweise an diesem Punkt der Zeit, wenn das hilft.
- Sie können übernehmen Sie die Kontrolle und den Kontext, in eine logische jax-ws-handler
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste option ist
@UsesJAXBContext
annotation. Mehr info hier: Geben Sie JAXB-Pakete in SLSB und JAX-WSIch habe es noch nicht getestet, wenn ich fand diese Anmerkung, die ich schon auf halbem Weg in Richtung andere Lösung, die hilfreich sein könnten für andere.
Der Schlüssel ist, mit
@WebServiceProvider
statt@WebService
, ein bisschen low-level, aber einfacher:Das ist es. Kundengruppen können gewonnen werden aus classpath bundle-context oder was auch immer.
Von dem, was ich weiß, gibt es keine "deklarative" Art und Weise, deutete an einem alternativen Weg zu unmarshall, auf die Sie bereits haben an Ort und Stelle als pro JAX-WS, oder JAXB - das, was Sie suchen. Übrigens, die "seltsame" Xerces Knoten ist eigentlich zu erwarten, da xsd:any/anyType und Objekt hand in hand gehen in Ihrem Szenario.
Mein Vorschlag ist, verwenden Sie eine relativ einfache und portable Lösung: bauen Sie Ihren eigenen dünnen "binding" - Ebene in Ihrer Allgemeinen web-Methode. Alle für die inbound -, ist das unmarshalling der XML-Knoten, die Java-Klasse wie pro Ihre anderen JAXB-bindings. Es muss dann das lookup eines Java-package-Namen (für Ihre JAXBContext) aus den QName des DOM-Element unmarshallt durch Ihre WS-stack. Zum nachschlagen können die Eigenschaften-Datei, Reflexion oder jeden anderen Mechanismus spezifisch für Ihre Implementierung sind. Für die outbound - (return) Sie dann eine umgekehrte Logik zu marshall die Antwort. Dieser Ansatz ist eigentlich Recht Häufig, besonders wenn der andere Typ nicht unterstützt-XML-bindings, die Technologien sind "getunnelt" durch eine standard WS-stack.