Im non sicuro se ho ottenuto la domanda giusta, ma credo di aver avuto il vostro stesso problema un paio di mesi fa, ecco la mia soluzione:
In primo luogo è necessaria una classe HeaderHandler, wich crea l'intestazione di sapone elemento, dovrebbe assomigliare a questo:
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;
}
}
Dopo di che si crea un HeaderHandlerResolver per gestire la creazione di intestazione e inserirlo in una catena gestore:
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;
}
}
Dopo di che, si aggiunge il Cliente:
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();
}
A proposito, non ho provato questo intestazione particolare, ho modificato un gestore di intestazione precedente ho avuto, quindi potrebbe non essere accurato, ma penso che sia abbastanza vicino, spero davvero che ti aiuti, provalo e dicci come verrà, cercherò di aiutarti se ancora non funziona.
fonte
2012-09-17 13:36:07
Questa risposta era usefult per me quando avevo bisogno di impostare un loggingHandler (qualcosa che registra le richieste/risposte) in un client ws. Grazie. – riskop
Qual è il risultato della restituzione di false dal metodo handleFault? E che ne dici di restituire null dal metodo getHeaders? –
@NicholasDiPiazza restituendo false bloccherà l'elaborazione del messaggio, stai praticamente dicendo "se questo gestore non riesce a scartare l'intero messaggio" controlla https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/ Handler.html # handleFault (C) Quando restituisci null in getHeaders sei "questo gestore non gestisce un'intestazione specifica", motivo per cui abbiamo il nostro risolutore di gestori, in modo retrospettivo puoi probabilmente eliminare il risolutore di handler restituendo il intestazioni giuste ma non l'ho provato https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/SOAPHandler.html#getHeaders() –