Ich bin nicht sicher, ob ich die Frage richtig verstanden habe, aber ich glaube, ich Ihre gleiche Problem vor ein paar Monaten hatte, also hier ist meine Lösung:
Zuerst eine HeaderHandler Klasse benötigen, wich schafft die Seife Kopf Element, sollte es so aussehen:
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
public boolean handleMessage(SOAPMessageContext smc) {
Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
String AUTH_TK = "http://www.myurl.com:port/subdir/etc/";
String NOPREFIX="";//no prefix
String PREFIX_XMLNS="xmlns";
String value = "123456";
if (outboundProperty.booleanValue()) {
try {
SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
SOAPHeader header = envelope.addHeader();
//<AuthorizationToken xmlns="http://www.myurl.com:port/subdir/etc/">
SOAPElement authorizationToken = header.addChildElement("AuthorizationToken", PREFIX_XMLNS, AUTH_TK);
//<Token>value</Token>
SOAPElement usernameToken =
authorizationToken.addChildElement("Token", NOPREFIX);
usernameToken.addTextNode(value);
//<Token>value</Token>
SOAPElement usernameToken =
authorizationToken.addChildElement("Token", PREFIX);
usernameToken.addTextNode(value);
} catch (Exception e) {
e.printStackTrace();
}
}
return outboundProperty;
}
public Set<QName> getHeaders() {
return null;
}
public void close(MessageContext arg0) {
}
public boolean handleFault(SOAPMessageContext arg0) {
return false;
}
}
Danach können Sie eine HeaderHandlerResolver erstellen die Header-Erstellung zu handhaben und es in einem Handler Kette einfügen:
import java.util.ArrayList;
import java.util.List;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;
public class HeaderHandlerResolver implements HandlerResolver {
@SuppressWarnings("unchecked")
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlerChain = new ArrayList<Handler>();
HeaderHandler hh = new HeaderHandler();
handlerChain.add(hh);
return handlerChain;
}
}
Danach fügen Sie im Client:
try{
//new service instance (your service should be extending javax.xml.ws.Service;)
YourServiceProxy service = new YourServiceProxy();
//calls the header handler resolver ;)
service.setHandlerResolver(new HeaderHandlerResolver());
//get the service
YourService port = (YourService)service.getYourService();
//call the service
port.yourMethod()
} catch (Exception e) {
e.printStackTrace();
}
By the way, ich diese besondere Header nicht getestet hätte, habe ich einen vorherigen Header-Handler geändert hatte ich, so dass es kann nicht genau sein, aber ich denke, es ist ziemlich nah, ich hoffe wirklich, es hilft dir, probier es aus und sag uns, wie es dazu kommt, ich werde versuchen, dir zu helfen, wenn es immer noch nicht funktioniert.
Diese Antwort war nützlich für mich, als ich einen LoggingHandler (etwas, das die Anfragen/Antworten ausloggt) in einem WS-Client einrichten musste. Vielen Dank. – riskop
Was ist das Ergebnis der Rückgabe von false von der Methode handleFault? Und was ist mit dem Zurückgeben von null von der Methode getHeaders? –
@ NicholasDiPiazza die Rückgabe von false wird die Verarbeitung der Nachricht blockieren, Sie sagen im Grunde "wenn dieser Handler nicht die gesamte Nachricht verwerfen" überprüfen https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/ Handler.html # handleFault (C) Wenn Sie null in getHeaders zurückgeben, sind Sie "dieser Handler behandelt keinen spezifischen Header", weshalb wir dann unseren eigenen Handler Resolver haben richtige Header, aber ich habe es nicht versucht https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/SOAPHandler.html#getHeaders() –