Soap-envelope-namespace-Präfix in Java-web-service
Ich versuche, ändern Sie den Präfix für die soap-Umschlag in der Antwort des web-service aus
S="http://schemas.xmlsoap.org/soap/envelope/"
zu
soap="http://schemas.xmlsoap.org/soap/envelope/":
also hier ist, wie die Reaktion jetzt aussieht:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<n:soaprequestResponse xmlns:n="http://tempuri.org/soaprequest">
<n:soaprequestResult/>
</n:soaprequestResponse>
</S:Body>
</S:Envelope>
und hier ist, wie es Aussehen muss:
<soap:Envelope xmlns:soap:="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<n:soaprequestResponse xmlns:n="http://tempuri.org/soaprequest">
<n:soaprequestResult/>
</n:soaprequestResponse>
</soap:Body>
</soap:Envelope>
Wie kann diese erreicht werden?
EDIT:
Fügte ich hinzu soap handler-Klasse und das problem beginnt, wenn ich versuche, Umschlag:
package org.tempuri.soaprequest;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class SoapHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public Set<QName> getHeaders() {
//do nothing
return null;
}
@Override
public boolean handleMessage(SOAPMessageContext context) {
if ((boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)) { //Check here that the message being intercepted is an outbound message from your service, otherwise ignore.
try {
SOAPEnvelope msg = context.getMessage().getSOAPPart().getEnvelope(); //just trying to get envelope
} catch (SOAPException ex) {
ex.printStackTrace();
}
return true; //indicates to the context to proceed with (normal)message processing
}
@Override
public boolean handleFault(SOAPMessageContext context) {
//do nothing
return true;
}
@Override
public void close(MessageContext context) {
//do nothing
}
}
SoapUI wirft:
<S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Server</faultcode>
<faultstring>JVMVRFY012 stack shapeinconsistent;class=com/sun/xml/messaging/saaj/soap/SOAPDocumentImpl, method=createDocumentFragment()Lorg/w3c/dom/DocumentFragment;, pc=5
</faultstring>
</S:Fault>
Tomcat-log hat keine Fehler.
Kommt es nicht ohne benutzerdefinierten soap-handler.
Vielleicht ist der Grund liegt in der Art und Weise, die ich implementiert web-Methode. Es erstellt einen neuen thread mit einem Objekt, dass Prozesse, die Anfrage und liefert dann eine leere Antwort, damit client Freigabe von warten auf Anforderung ist die Verarbeitung über:
@WebResult(name="soaprequestResult", targetNamespace="http://tempuri.org/soaprequest")
public SoaprequestResponse.SoaprequestResult soaprequest(@WebParam(name="streams", targetNamespace="http://tempuri.org/soaprequest") SoaprequestStreams streams) {
try {
new Thread(new MyProcess(streams)).start();
return new SoaprequestResponse().getSoaprequestResult();
} catch(Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String stackTrace = sw.toString();
return new SoaprequestResponse().getSoaprequestResult();
}
}
und MyProcess ist Klasse, wo die request-Verarbeitung wirklich ist und vorgegeben.executeUpdate ausgeführt.
- die
::
imsoap::Body
ist ein Schnittfehler, richtig ? - Vielleicht eine dumme Frage, aber warum? Sind beide identisch. Dennoch: stackoverflow.com/questions/12889943/...
- danke für den link, aber es erklärt sich ändernden Körper-Inhalt-ns-Präfix
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke Anpassung von JAX-WS Präfix einer SOAP-Antwort fasst Ihre Optionen.
Option 1: ich denke, Sie müssen nur über Ihr Paket.
Option 2: Alternativ (auch erwähnt in den link), könnten Sie ein
SOAPHandler
. Man könnte hinzufügen, eine Konfigurationsdatei zu bind diese Handler. Aber in der Tat, können Sie einfach fügen Sie Sie zur Laufzeit. Ich denke, dies Bedarf einiger Erklärung: Der trick ist, um eine Instanz derBindingProvider
. Dies ist anders, wenn Sie ein Verbraucher sind, oder der Anbieter des webservice.Wenn Sie server (d.h. die Bereitstellung einer webservice):
Wenn Sie Kunde (d.h. der Konsum einer webservice):
Wenn Sie die bindingprovider, Sie können binden der Ereignishandler wie folgt.
Jetzt für die verkettete handler selbst, Sie implementieren sollten
SOAPHandler<SOAPMessageContext>
. Dort können Sie manipulieren, Ihre Nachrichten, jedoch, das Sie mögen. (siehe verlinkten post oben für ein Beispiel).xmlns={@XmlNs{...}, @XmlNs{...}}
). Und option2 wirklich nicht geben Ihnen die volle Kontrolle für jede Ausgabe, die Sie mögen. (Bitte beachten Sie aber, dass niemand wirklich bestätigt, dass option1 arbeitete auch mit 1-namespace.)