Alex Rivera | Logout

How to read SOAP Header information from request and add it to response in spring web services

Asked 2011-12-15T13:49:42.770
9

I am working on spring web services. I need to add some custom elements in the request and response message.which should look like this:

<soapenv:Envelope>
   <soapenv:Header>
      <tid:SplsTID>
         <tid:Trantype>123</tid:Trantype>
         <tid:Tranver>234</tid:Tranver>
      </tid:SplsTID>
   </soapenv:Header>
   <soapenv:Body>
      <get:GetOrderNumberRequest LoggingLevel="REGULAR" MonitorFlag="Y">
         <get:Header>
            <get:TransactionId>111</get:TransactionId>
            <get:SourceSystemId>SOMS</get:SourceSystemId>
            <get:DateTime>2011-11-11T11:11:11</get:DateTime>
         </get:Header>
         <get:Body>
            <get:StaplesOrderNumber RangeFlag="N" ReleaseFlag="N">
               <get:OrderNumber Count="1" End="11" Start="9"/>
            </get:StaplesOrderNumber>
         </get:Body>
      </get:GetOrderNumberRequest>
   </soapenv:Body>
</soapenv:Envelope>

i am able to append <tid:SplsTID> under <soapenv:Header> in request by modifying the WSDL file. which looks like this:

<wsdl:message name="GetOrderNumberRequest">
        <wsdl:part element="tns:GetOrderNumberRequest" name="GetOrderNumberRequest">
        </wsdl:part>
        <wsdl:part element="sch1:SplsTID" name="SplsTID">
        </wsdl:part>
    </wsdl:message>
    <wsdl:message name="GetOrderNumberResponse">
        <wsdl:part element="tns:GetOrderNumberResponse" name="GetOrderNumberResponse">
        </wsdl:part>
        <wsdl:part element="sch1:SplsTID" name="SplsTID">
        </wsdl:part>
    </wsdl:message>
    <wsdl:portType name="ONAS">
        <wsdl:operation name="GetOrderNumber">
            <wsdl:input message="tns:GetOrde
Edit
Report

1 Answer

3

This is probably only half the answer you need but I think you can read the soapheaders by getting the (Saaj)SoapMessage from the messagecontext, like this:

@PayloadRoot(
    localPart = "GetHiredCandidatesRequest", 
    namespace = DEFAULT_NAMESPACE
)
@ResponsePayload
public GetHiredCandidatesResponse getKandidaat (
    @RequestPayload GetHiredCandidatesRequest getCandidate,
    MessageContext messageContext) {

    SaajSoapMessage request = (SaajSoapMessage) messageContext.getRequest();
    SoapHeader header = request.getSoapHeader();

    GetHiredCandidatesResponse response = objectFactory.createGetHiredCandidatesResponse();
    response.getCandidate().addAll(
        candidateService.getHiredCandidates(
            getCandidate.getFrom(), 
            getCandidate.getTo()
        )
    );

    return response;
}

Since version 2 you can automatically 'add' some objects to your method's signature, like I add the MessageContext here. I have used this to get the attachments from a soap message for instance. You can probably use other subclasses of AbstractSoapMessage as well since the the getSoapHeder method is in that class.

[edit] BTW: Perhaps you can use Interceptors as well since the request / response is provided there. Take a look at the org.springframework.ws.soap.server.endpoint.interceptor package for some default examples. [/edit]

answered 2011-12-19T14:46:01.547

Your Answer