gpt4 book ai didi

java - 无法在 SOAPHandler 中记录完整的 SOAP 消息

转载 作者:搜寻专家 更新时间:2023-11-01 02:25:39 24 4
gpt4 key购买 nike

我在客户端创建了一个 SOAPHandler 来记录对服务器的传出请求并在 SOAP 消息中添加了一个 SOAP header 。它正在记录没有 header 部分的传出 soap xml。但是在服务器端我能够记录整个带有 soap header 的消息。

服务器端日志:

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

请建议我如何在客户端记录带有 header 部分的 SOAP 消息

最佳答案

问题是您在修改消息后调用 writeTo 但您仍然打印旧版本(没有任何标题更改)。我建议你使用 saveChanges来自 SOAPMessage 的方法

abstract void saveChanges()

Updates this SOAPMessage object with all the changes that have been made to it.

然后尝试调用方法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>

关于java - 无法在 SOAPHandler 中记录完整的 SOAP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23589141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com