Не удается зарегистрировать полное сообщение SOAP в SOAPHandler


Я создал SOAPHandler на стороне клиента для регистрации исходящего запроса на сервер и добавил заголовок SOAP в SOAP message.It ведет журнал исходящего soap xml без заголовка части .Но в конце сервера я могу зарегистрировать все сообщение с заголовком soap.

Журнал на стороне сервера:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
    <Credential xmlns="http://soap.header.test.com" password="123" username="ashok"/>
</SOAP-ENV:Header>
<S:Body>
    <ns2:addNumber xmlns:ns2="http://service.ashok.com/">
        <arg0>10</arg0>
        <arg1>200</arg1>
    </ns2:addNumber>
</S:Body>

Журнал на стороне клиента

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/> **NO HEADER**
<S:Body>
    <ns2:addNumber xmlns:ns2="http://service.ashok.com/">
        <arg0>10</arg0>
        <arg1>200</arg1>
    </ns2:addNumber>
</S:Body>

Мой частичный SOAPHandler на стороне клиента

if (outgoingRequest) {
    SOAPMessage message = context.getMessage();
    SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
    SOAPHeader header = envelope.getHeader();
    if (null == header) {
      header = envelope.addHeader();
    }
    QName credential = new QName("http://soap.header.test.com","Credential");
    SOAPHeaderElement headerElement = header.addHeaderElement(credential);
    QName username = new QName("username");
    headerElement.addAttribute(username, "ashok");
    QName password = new QName("password");
    headerElement.addAttribute(password, "123");

    message.writeTo(System.out);
  }

Пожалуйста, подскажите мне, как зарегистрировать SOAP-сообщение с заголовочной частью в клиенте сторона

1 4

1 ответ:

Проблема в том, что вы вызываете writeTo после того, как Сообщение изменено, но вы все еще печатаете старую версию (без изменения заголовка). Я предлагаю вам использовать метод saveChanges из SOAPMessage

Абстрактные пустые saveChanges ()

Обновляет этот объект SOAPMessage со всеми изменениями, которые были внесены в него.

, а затем попробуйте вызвать метод writeTo . дайте мне знать, если это сработает.

Я попробовал ваш код как:

EchoServiceImplService echoService = new EchoServiceImplService();
        HandlerResolver resolver = new HandlerResolver(){

            @Override
            public List<Handler> getHandlerChain(PortInfo portInfo){
                List<Handler> handlers = new ArrayList<Handler>();
                handlers.add(new LogMessageHandler());
                return handlers;
            }
        };
        echoService.setHandlerResolver(resolver);
        EchoService port = echoService.getEchoServiceImplPort();

И

public class LogMessageHandler implements SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(SOAPMessageContext context){
        try {
            if ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)) {
                SOAPMessage message = context.getMessage();
                SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
                SOAPHeader header = envelope.getHeader();
                if (null == header)
                    header = envelope.addHeader();

                QName credential = new QName("http://soap.header.test.com", "Credential");
                SOAPHeaderElement headerElement = header.addHeaderElement(credential);
                QName username = new QName("username");
                headerElement.addAttribute(username, "ashok");
                QName password = new QName("password");
                headerElement.addAttribute(password, "123");

                message.writeTo(System.out);
                return true;
            }

        } catch (Exception e) {
            System.err.println("An error in handler occurs.");
        }
        return false;
    }

И я могу видеть полный SOAPMesssage на стороне клиента, просто вызовите обработчик, прежде чем отправить запрос на сервер.

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
   <Credential xmlns="http://soap.header.test.com" password="123" username="ashok"/></S:Header>
<S:Body>
   <ns2:echo xmlns:ns2="http://echo.soap.ws.jax.koitoer.com/">
       <arg0>Koitoer echo </arg0>
   </ns2:echo>
</S:Body>
</S:Envelope>