我们目前使用Spring的PayloadRootAnnotationMethodEndpointMapping
将传入的消息映射到适当的Java端点。我们将为用户社区提供新版本的WSDL(具有增强的业务功能),同时我们还需要继续支持现有版本的WSDL以实现向后兼容。
版本控制信息将嵌入名称空间' URN,例如:
瓮:myCompany中:myproject的:MyModule的:消息:1.0
瓮:myCompany中:myproject的:MyModule的:消息:1.1
由于只有一小部分Java方法在旧版本和新版本之间发生了变化,我想知道处理这两个版本之间没有改变的方法的最佳方法是什么。端点映射术语。换句话说,如何将两个版本的传入消息路由到同一个Java端点方法?
我想到的一个选项是编写一个自定义的Spring-ws端点映射类(可能通过扩展PayloadRootAnnotationMethodEndpointMapping
类。但在我编写任何代码之前,我想和你们一起检查一下见:
1)是否有一些关于通过单一服务器端实现支持多个版本的WSDL的最佳实践? 2)对于这种情况,Spring-ws是否有任何开箱即用的解决方案?
谢谢,
答案 0 :(得分:4)
从Spring-WS 2.2开始,有一个@PayloadRoots
注释,允许您将多个有效负载映射到一个方法,如下所示:
@PayloadRoots({
@PayloadRoot(localPart = "Request1", namespace = "http://springframework.org/spring-ws"),
@PayloadRoot(localPart = "Request2", namespace = "http://springframework.org/spring-ws")
})
public void doIt(@RequestPayload Source payload) {
...
}
我还想指出PayloadTransformingInterceptor
,它使用XSLT样式表转换SOAP消息的有效负载。根据两个版本的WSDL之间的差异,您可以转换" old"使用一个XSLT请求新格式,从而让它们由" new"处理。端点。反过来,"新"可以使用另一个XSLT将响应转换为旧格式。