【问题标题】:Set spring integration header into soap header in spring integration (without interceptor/ threadlocal)在spring集成中将spring集成头设置为soap头(没有拦截器/线程本地)
【发布时间】:2016-09-08 23:45:48
【问题描述】:

是否可以在 spring 集成 xml 中从 spring 集成标头中设置 SOAP-ENV 标头?

我尝试了以下方法,并希望将 bId 填充到肥皂标题中

<int:chain id="soapcall" input-channel="soapchannel">      
        <int-xml:header-enricher>
            <int-xml:header name="bId" expression="headers['bId']"/>
        </int-xml:header-enricher>
          <int-ws:outbound-gateway  uri="${soap.url}" interceptor="myInterceptor">
          </int-ws:outbound-gateway> 
     </int:chain>

但是实际输出没有标题。见下文:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:n1="http://namespace/n1">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body> ...
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

在调用出站网关之前,我还研究了链内的以下方法。似乎这个标题丰富器只将肥皂动作作为标题。所以这会抛出异常action headers not found

<int-ws:header-enricher >
            <int-ws:soap-action expression="headers['bId']"/>
          </int-ws:header-enricher>

我还查看了this 的帖子。但我无法在链中编译它。

【问题讨论】:

    标签: spring soap spring-integration spring-ws


    【解决方案1】:

    我不确定&lt;int-xml:header-enricher&gt; 是什么,但没关系。

    您需要的是在&lt;int-ws:outbound-gateway&gt; 上调用header-mapper

    它的代码如下:

    @Override
    protected void populateStandardHeaders(Map<String, Object> headers, SoapMessage target) {
        String soapAction = getHeaderIfAvailable(headers, WebServiceHeaders.SOAP_ACTION, String.class);
        if (!StringUtils.hasText(soapAction)) {
            soapAction = "\"\"";
        }
        target.setSoapAction(soapAction);
    }
    
    @Override
    protected void populateUserDefinedHeader(String headerName, Object headerValue, SoapMessage target) {
        SoapHeader soapHeader = target.getSoapHeader();
        if (headerValue instanceof String) {
            QName qname = QNameUtils.parseQNameString(headerName);
            soapHeader.addAttribute(qname, (String) headerValue);
        }
    }
    

    因此,默认情况下,它将WebServiceHeaders.SOAP_ACTION 映射为标准映射,并且所有那些用户定义为String 并且仅作为目标SOAP-ENV:Header 元素的attribute

    那些用户定义的标头可以通过以下方式映射:

    <xsd:attribute name="mapped-request-headers" type="xsd:string">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[
    Comma-separated list of names of SOAP Headers to be mapped from the SOAP request into the MessageHeaders.
    This can only be provided if the 'header-mapper' reference is not being set directly. The values in
    this list can also be simple patterns to be matched against the header names (e.g. "foo*" or "*foo").
                            ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>
    

    如果您需要将子元素填充到 &lt;SOAP-ENV:Header&gt;,您别无选择,除非扩展 DefaultSoapHeaderMapper 并覆盖 populateUserDefinedHeader() 并使用 SoapHeader.addHeaderElement() API。

    还可以查看Reference Manual

    【讨论】:

    • 基本上我想在拦截器中获取 spring 集成标头的值。我正在尝试不同的方法来实现这一目标。见我的original post
    • ???你的问题是“没有拦截器”。 OTOH 修改消息不是拦截器的责任。拦截器已经是 SOAP 的一部分。没有Spring Integration是正常的
    • 我正在尝试在拦截器中记录肥皂请求信封。 spring消息中的headers[bId],是数据库列,用于将每个soap请求关联到对应的数据库id。但拦截器不提供对 spring 集成消息头的访问权限。所以尝试通过将 bId 添加到肥皂标题来解决这里问题
    • 好的。所以,我认为使用简单的mapped-request-headers 和在拦截器中进一步提取的建议解决方案对你来说应该足够了。
    • 我整天都在尝试mapped-request-headers。不知道我之前错过了什么。现在工作了。谢谢。
    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多