Не удается зарегистрировать полное сообщение 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 ответ:
Проблема в том, что вы вызываете 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>