Как прочитать информацию заголовка SOAP из запроса и добавить ее в ответ в весенних веб-сервисах - PullRequest
5 голосов
/ 15 декабря 2011

Я работаю над весенними веб-сервисами. Мне нужно добавить некоторые пользовательские элементы в запрос и ответное сообщение, которое должно выглядеть следующим образом:

<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>

Я могу добавить <tid:SplsTID> в <soapenv:Header> в запросе, изменив файл WSDL. который выглядит так:

<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:GetOrderNumberRequest" name="GetOrderNumberRequest">
            </wsdl:input>
            <wsdl:output message="tns:GetOrderNumberResponse" name="GetOrderNumberResponse">
            </wsdl:output>
        </wsdl:operation>
    </wsdl:portType>

Проблема в том, что я хочу прочитать <tid:SplsTID> часть из запроса и хотел добавить ее под мыльной частью ответа, чего не происходит. Я использую конечную точку на основе аннотации. какой код будет читать заголовок мыла и добавлять его в ответ.

В настоящее время мой класс конечной точки:

@Endpoint
public class OrderNumberServiceEndPoint {
    public static final String NAMESPACE_URI = "http://schemas.staples.com/onas/getOrderNumber";

    /**
     * The local name of the expected request.
     */
    public static final String REQUEST_LOCAL_NAME = "GetOrderNumberRequest";

    /**
     * The local name of the created response.
     */
    public static final String RESPONSE_LOCAL_NAME = "GetOrderNumberResponse";

    private GetOrderNumberService getOrderNumberService;

    public void setGetOrderNumberService(
            GetOrderNumberService getOrderNumberService) {
        this.getOrderNumberService = getOrderNumberService;
    }

    @PayloadRoot(localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI)
    public GetOrderNumberResponse processOrderNumberRequest(
            GetOrderNumberRequest request) throws Exception {
        GetOrderNumberResponse response = null;
        try{
        response = getOrderNumberService.executeRequest(request);
        }catch(CannotCreateTransactionException e){
            logger.error(ErrorConstants.ERROR_E17);
            throw new ServiceException(ErrorConstants.ERROR_E17);
        }
        return response;
    }

}

Дайте мне знать, если потребуется более подробная информация. Любая помощь будет оценена.

Ответы [ 2 ]

12 голосов
/ 22 декабря 2011

Наконец мне удалось прочитать заголовок мыла из запроса и добавить в ответ.Вот как теперь выглядит мой метод конечной точки:

 @PayloadRoot(localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI)
    @ResponsePayload
    public GetOrderNumberResponse processOrderNumberRequest(
            @RequestPayload GetOrderNumberRequest request,
            MessageContext messageContext) throws Exception {
        logger.info("Request Received");
        // read SOAP Header from request and append in response
        SaajSoapMessage soapRequest = (SaajSoapMessage) messageContext
                .getRequest();
        SoapHeader reqheader = soapRequest.getSoapHeader();
        SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext
                .getResponse();
        SoapHeader respheader = soapResponse.getSoapHeader();
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        Iterator<SoapHeaderElement> itr = reqheader.examineAllHeaderElements();
        while (itr.hasNext()) {
            SoapHeaderElement ele = itr.next();
            transformer.transform(ele.getSource(), respheader.getResult());
        }
        // process the request PayLoad
        GetOrderNumberResponse response = null;
        try {
            response = getOrderNumberService.executeRequest(request);
        } catch (CannotCreateTransactionException e) {
            logger.error(ErrorConstants.ERROR_E17);
            throw new ServiceException(ErrorConstants.ERROR_E17);
        }
        logger.info("Response Sent");
        return response;
    }
3 голосов
/ 19 декабря 2011

Это, вероятно, только половина ответа, который вам нужен, но я думаю, что вы можете прочитать мыльные заголовки, получив (Saaj) SoapMessage из messagecontext, например:

@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;
}

Начиная с версии 2, вы можете автоматически «добавлять» некоторые объекты в сигнатуру вашего метода, как я добавляю MessageContext здесь. Я использовал это, чтобы получить вложения из мыльного сообщения, например. Возможно, вы также можете использовать другие подклассы AbstractSoapMessage, так как метод getSoapHeder находится в этом классе.

[править] КСТАТИ: Возможно, вы также можете использовать перехватчики, поскольку там есть запрос / ответ. Взгляните на пакет org.springframework.ws.soap.server.endpoint.interceptor для некоторых примеров по умолчанию. [/ Править]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...