Spring 集成 - 需要映射 SOAP Headers

Spring Integration - Need to Map SOAP Headers

在 spring-int 4.1 中,我的 header-mapper 工作正常,如下所示:

<int-ws:inbound-gateway id="my-gateway" 
    request-channel="my-gateway-input" 
    reply-channel="my-gateway-output"
    unmarshaller="jaxb2Marshaller" marshaller="jaxb2Marshaller"
    header-mapper="soapHeaderMapper" />
<beans:bean id="soapHeaderMapper" class="org.springframework.integration.ws.DefaultSoapHeaderMapper">
   <beans:property name="requestHeaderNames" value="*"/>
</beans:bean>

当我尝试升级到 spring-int 4.2 时,header-mapper 是不允许的。我需要它的原因是因为我需要映射 soap 安全 header。但我不认为它在没有指定 soapHeaderMapper 的情况下被映射。请注意,我确实有以下上游拦截 soap 请求,我很确定拦截器不会删除 soap header。如果您需要完整的配置,请告诉我。

<beans:bean id="wss4jSecurityInterceptor" class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
    <beans:property name="validationActions" value="UsernameToken"/>
    <beans:property name="validationCallbackHandler" ref="validationCallbackHandler"></beans:property>
    <beans:property name="removeSecurityHeader" value="false"></beans:property>
</beans:bean>

无操作。

仍然有效。

为什么您认为 header-mapper 被忽略了?

我们有这个测试配置:

<ws:inbound-gateway id="headerMappingGateway" request-channel="headerMappingRequests"
        header-mapper="testHeaderMapper"/>

关于此事的测试用例:

@Autowired
private SimpleWebServiceInboundGateway headerMappingGateway;

@Autowired
private SoapHeaderMapper testHeaderMapper;

@Test
public void testHeaderMapperReference() throws Exception {
    DirectFieldAccessor accessor = new DirectFieldAccessor(headerMappingGateway);
    Object headerMapper = accessor.getPropertyValue("headerMapper");
    assertEquals(testHeaderMapper, headerMapper);
}

所以,一切都应该像 Spring Integration 4.1 一样工作。

否则,请分享测试用例以重现。

我们感谢任何反馈!

P.S。当然,我看到我们有 XSD 错误输入预期和真正允许的内容。但这并不妨碍使用任何可能的自定义 SoapHeaderMapper 实现。