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
实现。
在 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
实现。