La solución a este tipo de problema en JAX-WS es implementar un controlador de SoapMessage (interfaz: SOAPHandler < SOAPMessageContext>). Dentro de ese controlador, inserte su encabezado HTTP en encabezados quizás ya existentes, luego le da el control al siguiente controlador en la cadena de controladores.
El concepto de esta cadena de manipuladores es agradable, puede tener clases pequeñas para un propósito muy específico (Seguridad, Registro, etc.).
En su cliente se configura el controlador de la cadena antes de enviar cualquier solicitud:
// HandlerChain installieren
Binding binding = ((BindingProvider) port).getBinding();
List hchain = binding.getHandlerChain();
if (hchain == null) {
hchain = new ArrayList();
}
hchain.add(new HTTPUserAgentHandler());
binding.setHandlerChain(hchain);
Y aquí es el código de la HTTPUserAgentHandler:
public class HTTPUserAgentHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
boolean request = ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue();
if (request) {
@SuppressWarnings("unchecked")
Map<String, List<String>> headers = (Map<String, List<String>>) context
.get(MessageContext.HTTP_REQUEST_HEADERS);
if (null == headers) {
headers = new HashMap<String, List<String>>();
}
headers.put("HTTP_USER_AGENT", Collections.singletonList("user_agent"));
context.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return true;
}
@Override
public void close(MessageContext context) {}
@Override
public Set<QName> getHeaders() {
return null;
}
}
bien hecho. Trabajó para mi. Gracias. – yngwietiger