После некоторого возни, если нашел немного другое решение.Я использую JAXB для маршалинга своей полезной нагрузки, и возможные классы заголовков также были сгенерированы с помощью JAXB из WSDL.В моем случае я обращаюсь к Microsoft Reporting Services и передаю ExecutionID в качестве заголовка SOAP.
public class ReportExecution2005Client extends WebServiceGatewaySupport {
private static final String SET_EXECUTION_PARAMETERS_ACTION = "http://schemas.microsoft.com/sqlserver/2005/06/30/reporting/reportingservices/SetExecutionParameters";
private final class SoapActionExecutionIdCallback implements WebServiceMessageCallback {
private final String soapAction;
private final String executionId;
public SoapActionExecutionIdCallback(String soapAction, String executionId) {
super();
this.soapAction = soapAction;
this.executionId = executionId;
}
@Override
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
SoapMessage soapMessage = (SoapMessage) message;
soapMessage.setSoapAction(soapAction);
ExecutionHeader executionHeader = new ExecutionHeader();
executionHeader.setExecutionID(executionId);
getMarshaller().marshal(executionHeader, soapMessage.getSoapHeader().getResult());
}
}
public void setExecutionParameters(String executionId){
SetExecutionParameters request = new SetExecutionParameters();
request.setParameters(new ArrayOfParameterValue());
SetExecutionParametersResponse response = (SetExecutionParametersResponse) getWebServiceTemplate().marshalSendAndReceive(request,
new SoapActionExecutionIdCallback(
SET_EXECUTION_PARAMETERS_ACTION,
executionId));
}
}
По существу, WebServiceGatewaySupport уже знает Marshaller для преобразования JAXB Pojos.Я использую этот, чтобы присоединить свои собственные классы заголовков к SoapHeader со следующей строкой:
getMarshaller().marshal(executionHeader, soapMessage.getSoapHeader().getResult());
в моем вложенном WebServiceMessageCallback.