在 SI 中将自定义标头添加到 MarshallingWebServiceOutboundGateway

问题描述 投票:0回答:2

晚上好

我正在尝试向请求添加自定义标头,但到目前为止我还不太成功。我找到了使用

Http.outboundGateway(...)
的示例,但我使用
MarshallingWebServiceOutboundGateway
.

下面的不行,我看不到HTTP请求的header属性

@Bean
public IntegrationFlow processRequest() {
    return flow -> flow.channel(INPUT_CHANNEL)
            .transform(requestMapper, "mapFrom")
            .enrichHeaders(
                    h -> h.header(X_TRANSACTION_ID, "somevalue")
                          .header(CLIENT_ID, "somevalue")
                          .header(CLIENT_SECRET, "somevalue")
            )
            .handle(webserviceOutboundGateway)
            .channel(OUTPUT_CHANNEL);
}

我不知道我错过了什么。请给我任何提示。

问候, 五、

+++++++++更新++++++++++

根据 Artem 的提示,我制作了以下内容:

@Bean
@Autowired
public MarshallingWebServiceOutboundGateway muleMLGatewayWebserviceOutboundGateway(...) {
    MarshallingWebServiceOutboundGateway gateway = ...;
    gateway.setAdviceChain(Collections.singletonList(muleGatewayFailingAdvice()));
    gateway.setHeaderMapper(muleSecurityAttributesHeaderMapper());
    return gateway;
}

@Bean
public SoapHeaderMapper muleSecurityAttributesHeaderMapper() {
    return new MuleSecurityAttributesHeaderMapper();
}

class MuleSecurityAttributesHeaderMapper extends DefaultSoapHeaderMapper {

    @Override
    protected void populateUserDefinedHeader(String headerName, Object headerValue, SoapMessage soapMessage) {
        super.populateUserDefinedHeader(headerName, headerValue, soapMessage);
        MimeHeaders mimeHeaders = ((SaajSoapMessage)soapMessage).getSaajMessage().getMimeHeaders();
        mimeHeaders.setHeader("a", "b");
        setRequestHeaderNames("a");
    }
}

但是,恐怕我仍然找不到自定义 HTTP 请求标头。
有什么想法吗?

spring-integration spring-integration-dsl
2个回答
0
投票

看起来你可以子类化

SaajSoapMessageFactory
并覆盖 postProcess - 看起来这是默认实现添加一个空的 soap 动作标头(如果缺少)的地方。

您可能还应该从覆盖中调用

super
方法。


0
投票

如果您真的需要设置目标传输标头(例如 HTTP 请求)而不是那些 SAOP 信封属性,那么您肯定需要查看

SoapHeaderMapper
的自定义实现,例如
DefaultSoapHeaderMapper
的扩展,您需要在其中覆盖
populateUserDefinedHeader()
。然后将
SoapMessage
转换为
SaajSoapMessage
并执行以下操作:

MimeHeaders mimeHeaders = getSaajMessage().getMimeHeaders();
mimeHeaders.setHeader(headerName, headerValue);

当然,一定要用你想映射到请求的名字来调用

setRequestHeaderNames()

更新

你的代码必须是这样的:

类 MuleSecurityAttributesHeaderMapper 扩展 DefaultSoapHeaderMapper {

public MuleSecurityAttributesHeaderMapper() {
    setRequestHeaderNames(STANDARD_HEADER_NAMES, "a");
}

@Override
protected void populateUserDefinedHeader(String headerName, Object headerValue, SoapMessage soapMessage) {
    MimeHeaders mimeHeaders = ((SaajSoapMessage)soapMessage).getSaajMessage().getMimeHeaders();
    mimeHeaders.setHeader(headerName, headerValue.toString());
}

}

© www.soinside.com 2019 - 2024. All rights reserved.