我正在尝试使用 Spring Integration 发送 SOAP 请求,例如
<int:chain input-channel="wsOutChannel" output-channel="stdoutChannel">
<int-ws:header-enricher>
<int-ws:soap-action value="..."/>
</int-ws:header-enricher>
<int-ws:outbound-gateway
uri="..."/>
</int:chain>
但是您只能添加 SOAP 主体,Spring Integration 添加信封、 header 和主体标签,例如
<SOAP-ENV:Envelope>
<SOAP-ENV:Header>
<SOAP-ENV:Body>
...
</SOAP-ENV:Body>
<SOAP-ENV:Header>
</SOAP-ENV:Envelope>
我需要自定义具有特定属性的信封和 header 标签,例如:
<soapenv:Envelope attribute1="value1" attribute2="value2">
和子元素,例如:
<soapenv:Header>
<child>...<child>
<soapenv:Header>
这可以通过 Spring Integration Web Services 实现,还是我不应该使用 int-ws:outbound-gateway
并采取不同的方法?
最佳答案
您可以添加一个 ClientInterceptor
(通过 interceptor
属性),它允许您在发送请求之前修改请求。
编辑
@Artem 的建议更简单,但是拦截器也可以让您访问响应;但无论哪种方式,代码都是相似的。
对于拦截器:
public class MyInterceptor extends ClientInterceptorAdapter {
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
SoapMessage request = (SoapMessage) messageContext.getRequest();
SoapEnvelope envelope = request.getEnvelope();
envelope.addAttribute(new QName("foo"), "bar");
SoapHeader header = envelope.getHeader();
header.addHeaderElement(new QName("http://fiz/buz", "baz"));
return super.handleRequest(messageContext);
}
}
对于回调版本:
@Override
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
SoapEnvelope envelope = ((SoapMessage) message).getEnvelope();
envelope.addAttribute(new QName("foo"), "bar");
SoapHeader header = envelope.getHeader();
header.addHeaderElement(new QName("http://fiz/buz", "baz"));
}
关于soap - 自定义 Spring Integration Web 服务 SOAP 信封/ header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39399377/