晚上好
我正在尝试向请求添加自定义标头,但到目前为止我还不太成功。我找到了使用
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 请求标头。
有什么想法吗?
看起来你可以子类化
SaajSoapMessageFactory
并覆盖 postProcess - 看起来这是默认实现添加一个空的 soap 动作标头(如果缺少)的地方。
您可能还应该从覆盖中调用
super
方法。
如果您真的需要设置目标传输标头(例如 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());
}
}