如何合并来自不同服务的 WSDL 和 XSD 的公共部分?

我必须与一组 Web 服务进行交互,每个服务都有自己的 WSDL 和 XSD。XSD 有时合并到单个文件中,有时分布在多个文件 (20-30) 中。但是,根据经验,我知道大多数消息结构和数据共享一个很大的公共子集,也许只有20%在不同的事务之间是不同的。

不幸的是,我无法控制服务器部件或服务的声明,因此让他们修复它是不可能的。客户端的第一个版本分别生成每个服务,然后将它们用作单独的外观,以形成一个连贯的更高级别的服务,作为另一个系统的适配器。

我将 CXF 与缺省的 JAXB 绑定一起使用,并为每个服务强加了不同的生成包。我这样做是因为一些大多数服务使用通用数据模型,但并非所有服务都使用相同的版本或自定义,所以我有冲突,因此选择了蛮力,所以我可以完成系统。

但是,这会导致适配器的内存要求在每个服务加载其上下文时通过屋顶。现在,我甚至在开始发送请求和处理响应之前就已经使用了超过500M的内存,仅用于容纳服务客户端的适配器。虽然我可以使用当前情况毫无问题地运行系统,但这会产生危及解决方案部署的约束;我的客户希望大幅减少这种情况(60%或更多),以便该系统可以与其他系统一起安装,而无需硬件升级。

问题如下:有没有一种工具或技术可以让我将每个交易的公共部分放在一起,以便它们可以生成一次并在需要时引用?

除了将系统重构为不同的框架或数据绑定所需的时间外,我没有受 CXF 或 JAXB 的约束。

提前感谢您的帮助。

--- 编辑---

谢谢布莱斯。这指向了JAXB的一个有用的功能:剧集。不幸的是,我仍然需要提取不同服务的公共基础部分。因此,现在我需要的是一种通过结构差异提取此公共部分的方法,这是一个差异工具,可以了解XSD描述的结构和类型层次结构,以便将适当的引用放在适当的位置以将公共部分与专用部分连接起来。


答案 1

如果你想稍微削减一点,另一种编组技术(在任何框架中)可能会起作用 - 删除JAXB并尝试JiBX,它已添加到最新的CXF版本中,或者只是StAX。

由于您希望做一些比传统的 JAX-Ws/JAXB 样式服务更多的自定义操作,因此您可能需要考虑 Spring-WS。

Spring-WS 使您可以控制 Web 服务堆栈的所有方面。它可以以不同的方式(有效负载,XPath表达式等)路由消息,并且您可以使用所需的任何编组/序列化技术(Jibx,jDOM,SAX等)

下表说明了这些选项:http://static.springsource.org/spring-ws/sites/2.0/reference/html/server.html#d4e1062

如果你真的想花哨,你可以使用一个较低级别的API,开始编组消息,一旦你达到了一个公共区域的临界质量,就可以当场启动JAXB马歇尔。

将消息路由到不同的“端点”(在Spring-WS术语中)的能力意味着您还可以在此接口(看起来像DOM / SAX / etc)上执行诸如“接受任何消息”之类的操作,然后在那里进行一次大型编组操作。

Spring-WS在这里为你买到的关键是打破JAX-WS的模式,做一些前期游戏,然后你可以随时在以后回到JAXB,无论是在拦截器,你的应用程序等。或者,您可以使用JAXB DOM Source进行相同的操作,但是我认为Spring-WS堆栈可以为您提供最好的粒度控制,以应对像您这里这样的特殊情况。


答案 2

最好的诀窍是为静态wsdl提供服务。只需打开 wsdl,保存它,上传到服务器中,然后指示客户端指向静态的,而不是动态的自我生成的。


推荐