2013-04-04 100 views
0

我的环境的前提编码:我在春天3运行使用弹簧WS处理所有SOAP要求。我已经与多家供应商进行了多次整合,没有出现任何问题。RPC /与JAXWS

问题:这个最近的集成有一个供应商运行真正古老的东西,他们的WSDLs使用rpc绑定样式。不用说JAXWS并不完全支持rpc(因为它是interop的对立面,所以这是正确的)。

可能的解决办法#1:我仍然可以尝试生成使用Axis 1.其实我已经做到了这一点,但我非常非常不愿意引入轴依赖到我的POM他们的WSDL的存根。我很确定会有大量的图书馆冲突,可能会混淆当前非常稳定的环境。

可能的解决方案#2:我可以尝试将他们的WSDL重写为JAXWS能够解析的文档/文本。运行了一些问题实际上重写的WSDL(获得“架构描述符{} XXX XXX在消息部分‘XXX’是没有定义,无法绑定到Java”)。除此之外,如果他们的终端专门检查rpc,我就会被搞砸了。

可能的解决方案#3:我可以部署一个全新的运行Axis和此服务客户端的盒子。即主项目使REST调用这个框,这个框会发出SOAP请求并解析响应。看起来像一个非常非常愚蠢的方式(和一些简单的工作荒谬的工作量)去做这件事。

的任何解决方案,我已经错过了?此外,我一直在为此搜索谷歌,虽然有些人在第一名中取得了成功,但没有人真正谈论此后的后果。 (即处理轴的传统依赖,试图使轴在春季3发挥好,等)

回答

0

#1

的一种方式,使#1更稳定是让自己轴心国的本地副本您将使用这些源来构建您自己的Axis jar(s)副本。但是你改变了整个事物的包装。例如,取而代之的是org.apache.axis,它变成了com.mycompany.org.apache.axis,翻译变得非常机械。

然后,轴1的任何依赖关系(如老版本的公地BeanUtils的,也许)将得到同样的待遇。加载他们的罐子。用你自己的定制包装构建他们的罐子。 (如果他们用Maven构建,确定的依赖是比较容易。)

这样做不会牺牲纳入更新和修复到原来的Axis代码的能力,一些努力。任何发布的更新成为一组,你必须弄清楚如何融入你的本地副本中每个java文件有改动packageimports线的变化。

#2

说不上约#2。它是一骰子,不是吗。

#3

你在做什么在#3是ESB是什么在真正的好。 3号是你自己写迷你翻译器的地方。我已经完成了,它工作得很好。

但是你实际上可以在同一个盒子上构建第3步。你不需要另一个盒子。您将小翻译器应用程序部署为主端口上运行的独立应用程序。您可以将应用程序部署在不同的端口上或作为不同的URL /路径。翻译器应用程序使用Axis1并转换传入的消息,将其传递并将响应转换回来。

该解决方案的一个好处是,它可以像处理一个应用程序一样处理负载平衡。翻译器应用程序和主应用程序一起使用它们共享的cpu周期桶。如果您需要更多,请添加更多设置完全相同的服务器。

+0

感谢您的评论李。 #1不确定你的意思。通过Axis的WSDL2Java生成的存根固有地扩展了Axis特定的对象。例如,所有服务都从org.apache.axis.client.Service继承。您是否建议我在源代码库中包含所有的Axis源代码并重构它们,而不是将Axis作为Maven依赖项? – Michael 2013-04-04 18:30:16

+0

#3是的,我听到你,我的一个坏的术语。我并不是指像物理盒子那样的盒子,而是一个单独的逻辑上下文和一个不同的已部署应用程序。可以坐在相同的盒子上,虽然这是一个不同的蠕虫罐,因为我与许多盒子聚集在一起。 ESB听起来像一个巨大的矫枉过正! – Michael 2013-04-04 18:31:48

+0

是的,我的意思是建立你自己的Axis jar,稍做修改以适应软件包,Axis源代码的副本。不要将它完全混入你自己的源代码中。我已经看到,在Weblogic或WebSphere等其他用户希望使用第三方jar的情况下,这种方式取得了良好的效果,但不希望其版本与其客户所需的版本冲突。新Websphere使用OSGI以不同的方式避免这个问题。 – 2013-04-04 18:35:22