Leo*_*Roy 3 java spring soap web-services interceptor
我有一个 SOAP 服务,我需要与之交谈。第一个 SOAP 请求在 SOAP 标头中接收带有sessionID元素的响应,我需要在最终发布命令中发送该元素。
为了获取这个 sessionID 值,我计划使用ClientInterceptor。在我的WebServiceGatewaySupport实现中,我注册了我的拦截器:
this.setInterceptors(new ClientInterceptor[] { new MyWebServiceClientInterceptor() });
Run Code Online (Sandbox Code Playgroud)
我的拦截器:
public class MyWebServiceClientInterceptor implements ClientInterceptor {
public final QName SessionID_QNAME = new QName("http://xml.example.com/ws/session", "sessionID");
public boolean handleFault(MessageContext context) throws WebServiceClientException {
logger.info("Handle Fault");
return true;
}
public boolean handleResponse(MessageContext context) throws WebServiceClientException {
logger.info("Handle Response");
SoapMessage soapMessage = (SoapMessage) context.getRequest();
SoapHeader soapHeader = soapMessage.getSoapHeader();
logger.info("Response Header: " + soapHeader.getName());
Iterator<SoapHeaderElement> qn = soapHeader.examineAllHeaderElements();
while (qn.hasNext()) {
SoapElement elem = qn.next();
logger.info(elem.toString());
}
Iterator<QName> an = soapHeader.getAllAttributes();
while (an.hasNext()) {
QName elem = an.next();
logger.info(elem.toString());
}
return true;
}
public boolean handleRequest(MessageContext context) throws WebServiceClientException {
logger.info("Handle Request");
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我不断返回一个空的 SOAP 标头。我正在运行 Wireshark 并且可以清楚地看到返回的 SOAP 数据包中的sessionID令牌,因此对正在发生的事情一无所知。有任何想法吗?
我是个白痴。'这是一个错字。我需要打电话:
SoapMessage soapMessage = (SoapMessage) context.getResponse();
Run Code Online (Sandbox Code Playgroud)
不是:
SoapMessage soapMessage = (SoapMessage) context.getRequest();
Run Code Online (Sandbox Code Playgroud)
那些想要在请求上设置标头并在响应上接收标头的完整代码:
ClientInterceptor 接收自定义 SOAP 标头值:
public class MyWebServiceClientInterceptor implements ClientInterceptor {
public boolean handleFault(MessageContext context) throws WebServiceClientException {
return true;
}
public boolean handleResponse(MessageContext context) throws WebServiceClientException {
SoapMessage soapMessage = (SoapMessage) context.getResponse();
SoapHeader soapHeader = soapMessage.getSoapHeader();
Iterator<SoapHeaderElement> qn = soapHeader.examineHeaderElements(MY_SESSIONID_QNAME);
while (qn.hasNext()) {
SoapElement elem = qn.next();
SoapHeaderElement headerElem = (SoapHeaderElement) elem;
if (StringUtil.validString(headerElem.getText())) {
if (!headerElem.getText().equals(sessionId)) {
sessionId = headerElem.getText();
logger.info("Bound to Session ID: " + sessionId);
}
}
}
return true;
}
public boolean handleRequest(MessageContext context) throws WebServiceClientException {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我在哪里使用拦截器:
public class MySoapClient extends WebServiceGatewaySupport {
public MySoapClient() {
this.setInterceptors(new ClientInterceptor[] { new MyWebServiceClientInterceptor() });
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
设置自定义 SOAP Header 的回调:class MySoapActionCallback 实现 WebServiceMessageCallback {
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
SaajSoapMessage soapMessage = (SaajSoapMessage) message;
SoapHeaderElement messageId = soapMessage.getSoapHeader().addHeaderElement(SessionID_QNAME);
if (StringUtil.validString(sessionId)) {
messageId.setText(sessionId);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在哪里使用回调:
JAXBElement<ReturnType> result = (JAXBElement<ReturnType>) getWebServiceTemplate().marshalSendAndReceive(of.createRelease(null), new MySoapActionCallback());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5688 次 |
| 最近记录: |