MTOM für JAX-WS-Web-Services aktivieren
Mit Java™ API for XML-Based Web Services (JAX-WS) können Sie binäre Anhänge, wie z. B. Bilder oder Dateien, zusammen mit Web-Service-Anforderungen senden. JAX-WS bietet Unterstützung für eine optimierte Übertragung binärer Daten gemäß der Spezifikation "SOAP Message Transmission Optimization Mechanism (MTOM)".
Informationen zu diesem Vorgang
JAX-WS unterstützt die Verwendung von SOAP Message Transmission Optimized Mechanism (MTOM) für das Senden binärer Anhangsdaten. Wenn Sie MTOM aktivieren, können Sie binäre Daten optimal senden und empfangen. Es entstehen keine Kosten für die Datencodierung, die sonst anfallen, wenn die binären Daten in ein XML-Dokument eingebettet werden müssen.
Der Anwendungsserver unterstützt das Senden von Anhängen über MTOM nur für JAX-WS-Anwendungen. Über die neuen MTOM- und XOP-Standards bietet dieses Produkt bietet außerdem die Möglichkeit, Anhänge mit SOAP-Nachrichten bereitzustellen, die der Spezifikation "Web Services Security" entsprechen.
JAX-WS-Anwendungen können Binärdaten im base64- oder hexBinary-Format im XML-Dokument senden. Wenn Sie jedoch die Optimierungen nutzen möchten, die MTOM bietet, müssen Sie MTOM so aktivieren, dass binäre Daten im base64-Format als Anhänge außerhalb des XML-Dokuments gesendet werden. Die MTOM-Optimierung ist standardmäßig nicht aktiviert. JAX-WS-Anwendungen setzen für die Aktivierung der MTOM-Unterstützung eine separate Konfiguration der Client- und Serverartefakte voraus.
Vorgehensweise
Ergebnisse
Sie haben eine Client/Server-Anwendung vom Typ JAX-WS-Web-Services entwickelt, die Binärdaten optimal über MTOM sendet und empfängt.
Beispiel
Das folgende Beispiel veranschaulicht, wie die MTOM-Unterstützung im Web-Service-Client und -Server-Endpunkt aktiviert wird, wenn eine WSDL-Datei als Ausgangspunkt verwendet wird.
- Suchen Sie die WSDL-Datei, die das Element xsd:base64Binary enthält.
Das folgende Beispiel stammt aus einer WSDL-Datei, die ein Element xsd:base64Binary enthält.
<types> ........ <xs:complexType name="ImageDepot"> <xs:sequence> <xs:element name="imageData" type="xs:base64Binary" xmime:expectedContentTypes="image/jpeg"/> </xs:sequence> </xs:complexType> ........ </types>
- Führen Sie den Befehl wsimport im Verzeichnis app_server_root\bin\
für die WSDL-Datei aus, um einen Satz portierbarer JAX-WS-Artefakte zu generieren.
Stammverzeichnis_des_Anwendungsservers\bin\wsimport.bat <WSDL-URL>
Stammverzeichnis_des_Anwendungsservers/bin/wsimport.sh <WSDL-URL>
Je nach expectedContentTypes-Wert, der in der WSDL-Datei enthalten ist, haben die generierten JAXB-Artefakte den Java-Typ, der in der folgenden Tabelle beschrieben ist:Tabelle 1. Zuordnung von MIME-Typ und Java-Typ. Beschreibt die Zuordnung von MIME-Typen und Java-Typen. MIME-Typ Java-Typ image/gif java.awt.Image image/jpeg java.awt.Image text/plain java.lang.String text/xml javax.xml.transform.Source application/xml javax.xml.transform.Source */* javax.activation.DataHandler - Verwenden Sie die JAXB-Artefakte wie in jeder anderen JAX-WS-Anwendung. Verwenden Sie diese Beans, um Binärdaten über die Client-APIs "Dispatch" und "Dynamic Proxy" zu senden.
- Aktivieren Sie MTOM in einem Dispatch-Client.
// Dispatch-Instanz erstellen. JAXBContext jbc = JAXBContext.newInstance("org.apache.axis2.jaxws.sample.mtom"); Dispatch<Object> dispatch = svc.createDispatch(portName, jbc, Service.Mode.PAYLOAD); // MTOM aktivieren SOAPBinding binding = (SOAPBinding) dispatch.getBinding(); binding.setMTOMEnabled(true);
- Aktivieren Sie MTOM in einem Dynamic-Proxy-Client.
Da Sie den JAX-WS-Client nun für MTOM aktiviert haben, sind die Nachrichten, die an den Server gesendet werden, MTOM-fähig. Damit der Server dem Client auch über MTOM antwortet, müssen Sie jedoch MTOM im Endpunkt aktivieren.// Dynamic-Proxy-Instanz erstellen. Service svc = Service.create(serviceName); MtomSample proxy = svc.getPort(portName, MtomSample.class); // MTOM aktivieren BindingProvider bp = (BindingProvider) proxy; SOAPBinding binding = (SOAPBinding) bp.getBinding(); binding.setMTOMEnabled(true);
- Aktivieren Sie MTOM in Ihrer Endpunktimplementierungsklasse.
Die Klasse jaxax.xml.ws.SOAPBinding hat ein statisches Element für jeden der unterstützten Bindungstypen. Fügen Sie SOAP11HTTP_MTOM_BINDING oder SOAP12HTTP_MTOM_BINDING als Wert für die Annotation @BindingType ein. Dieser Wert aktiviert alle Serverantworten für MTOM.@MTOM(enabled, threshold=4096) @WebService (endpointInterface="org.apache.axis2.jaxws.sample.mtom.MtomSample") public class MtomSampleService implements MtomSample { .... }
Wenn Sie MTOM im Server und im Client aktivieren, werden die Binärdaten, die den Anhang darstellen, als MIME-Anhang (Multipurpose Internet Mail Extensions) in die SOAP-Nachricht eingefügt. Ohne MTOM werden diese Daten in dem Format codiert, das das XML-Schema beschreibt (base64 oder hexadecimal), und in das XML-Dokument eingefügt.
... weitere Transportheader ...
Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812;
type="application/xop+xml"; start="
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>"; start-info="text/xml"; charset=UTF-8
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: application/xop+xml; charset=UTF-8; type="text/xml";
content-transfer-encoding: binary
content-id:
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/>
</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: text/plain
content-transfer-encoding: binary
content-id:
<1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org>
… hier sind die Binärdaten enthalten …
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812--
... weitere Transportheader ...
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>R0lGADl ... more base64 encoded data ... KTJk8giAAA7</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
Weitere Informationen finden Sie im Abschnitt "Beispiele" des Information Center. Eines der dort aufgeführten Beispiele veranschaulicht die Verwendung von MTOM mit JAX-WS-Web-Services.