Java 使用JAXWS进行rpc/编码

Java 使用JAXWS进行rpc/编码,java,web-services,jax-ws,axis,Java,Web Services,Jax Ws,Axis,我的环境的前提:我在Spring3上运行,使用SpringWS处理所有SOAP需求。我与不同的供应商进行了多次集成,在这方面没有任何问题 问题:最近的集成有一家供应商运行非常陈旧的东西,他们的WSDL使用rpc绑定样式。不用说,JAXWS不太支持rpc(这是正确的,因为它与互操作相反) 可能的解决方案#1:我仍然可以尝试使用Axis 1在其WSDL上生成存根。事实上,我已经这样做了,但是我非常不愿意在我的pom中引入Axis依赖。我很确定会有大量的库冲突,可能会破坏目前非常稳定的环境 可能的解决

我的环境的前提:我在Spring3上运行,使用SpringWS处理所有SOAP需求。我与不同的供应商进行了多次集成,在这方面没有任何问题

问题:最近的集成有一家供应商运行非常陈旧的东西,他们的WSDL使用rpc绑定样式。不用说,JAXWS不太支持rpc(这是正确的,因为它与互操作相反)

可能的解决方案#1:我仍然可以尝试使用Axis 1在其WSDL上生成存根。事实上,我已经这样做了,但是我非常不愿意在我的pom中引入Axis依赖。我很确定会有大量的库冲突,可能会破坏目前非常稳定的环境

可能的解决方案#2:我可以尝试将他们的WSDL重写为JAXWS能够解析的文档/文本。在重写wsdl时遇到了一些问题(获取“消息部分“xxx”中的模式描述符{xxx}xxx未定义,无法绑定到Java”)。此外,如果他们的端点专门检查rpc,我就完蛋了

可能的解决方案#3:我可以专门部署全新的box running Axis和此服务客户端。Ie主项目对此框进行REST调用,该框发出SOAP请求并解析回响应。这似乎是一种非常愚蠢的方式(对于一些本应简单的事情来说,这是一种荒谬的工作量)

我错过了什么解决方案?此外,我一直在搜索谷歌的搜索结果,虽然有些人在#1上取得了成功,但没有人真正谈论这之后的后果。(即处理Axis的遗留依赖项,尝试让Axis在Spring 3中发挥出色,等等)

#1

使#1更稳定的一种方法是为自己获取一个Axis源的本地副本,用于构建自己的Axis jar副本。但你改变了整件事的包装。例如,它不是org.apache.axis,而是com.mycompany.org.apache.axis,翻译变得相当机械

然后,Axis1的任何依赖项(可能像commons beanutils的旧版本)都将得到相同的处理。装上他们的罐子。用您自己的定制包装构建他们的罐子。(如果它们使用Maven构建,那么确定依赖关系就更容易了。)

这样做确实会在将更新和修复合并到原始Axis代码的能力方面牺牲一些精力。任何发布的更新都会变成一组更改,您必须弄清楚如何将这些更改合并到本地副本中,其中每个.java文件都会更改
导入

#2

对#2一无所知。这是掷骰子,不是吗

#3

您在#3中所做的是ESB真正擅长的。第三个是你自己编写迷你翻译器的地方。我已经做到了,效果很好

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


这个解决方案的一个优点是,它可以像处理一个应用程序一样处理负载平衡。translator应用程序和主应用程序的负载将一起增加,并使用它们共享的cpu周期。如果您需要更多服务器,请添加更多与此完全相同的服务器。

谢谢您的评论#我不确定你的确切意思。通过Axis的WSDL2Java生成的存根本质上扩展了Axis特定的对象。例如,所有服务都继承自org.apache.axis.client.Service。你是否建议我将所有Axis源代码都包含在我的源代码库中,并对它们进行重构,而不是将Axis作为maven依赖项来包含?#3是的,我听到了,这是一个糟糕的术语。我指的不是物理盒子中的盒子,而是一个单独的逻辑上下文和一个不同的部署应用程序。我可以坐在同一个盒子上,虽然那是一个不同的蠕虫罐头,因为我有很多盒子。ESB听起来像是一个巨大的杀伤力!是的,我的意思是从您自己的Axis源代码的拷贝中构建您自己的Axis jar。不要真的把它和你自己的来源完全混在一起。我已经在Weblogic或WebSphere这样的东西中看到了良好的效果,他们希望使用第三方JAR,但不希望其版本与客户要求的版本冲突。新的Websphere使用OSGI以不同的方式避免问题。