2010-08-12 100 views
0

我必须为一组Web服务提供接口,为此我已生成代码存根和对象绑定。许多事务共享一个通用的对象模型,因此大部分生成的代码重叠。通常这不会成为问题,因为我只是重复使用相同的代码,因为wsdl会链接相同的xsd文件。如何同时使用同一类的不同版本

不幸的是,这些服务的提供者已经将xsd分开,以便每个服务绑定到相同文件的单独集(基本上是副本)。在他们的规范中,他们声明客户端的实现应该隔离每个Web服务以便于维护。基本上,他们希望能够修改单个Web服务的xsd,同时保持所有其他服务器不变。

的问题如下:

我怎么能在同一程序中,使每个服务暴露了他们的功能,而与他们的弟兄干扰整合这些不同的组生成的类的?

我认为的一个解决方案是为每个解决方案创建一个外观,以展示所需的功能和对象模型,以便实际实现保持隐藏状态。然后,巧妙地使用自定义类加载器的每个外观将加载包含此特定服务的生成代码的特定jar。

有没有想法?想法?你遇到类似问题的经历是什么?

谢谢

回答

1

一般来说,最简单的方法是使用jaxb绑定文件(或CXF的wsdl2java工具的-p参数)将生成的代码映射到特定服务的特定包中。因此,每个服务都有它自己的对象来处理。

如果您必须整合各种服务,复杂性将会出现。就像从一个回到另一个。由于对象将完全不同,因此您需要编写代码以将数据从一个复制到另一个。可能不好玩。 :-(

+0

是的,这是我最终做的,通过挖掘更多的Codegen选项,我偶然发现了这种可能性。虽然不是问题的直接解决方案,但确实提供了解决问题的简单而安全的方法。 – Newtopian 2010-08-12 19:14:48

2

您是否考虑过使用基于OSGi的软件包(例如Eclipse Equinox运行时)?使用基于OSGi的实现,每组生成的类都将位于一个单独的包(.jar文件)中,该包可以获得自己的类加载器,并可以将其部分API有选择地导出到应用程序的其余部分。因此,它提供了您提出的解决方案的现成实施。

+0

的确,OSGi会非常适合这个目的,谢谢你的建议。然而,考虑到这个特定的设置,我使用了一个简单的解决方案,让生成器将代码放在单独的包中,从而解决问题而不是通过它。 – Newtopian 2010-08-12 19:10:48

0

对于Java,当两个类由不同的类加载器加载时,两个类彼此不同,您可以利用这两个类自己从两个URLClassLoaders中加载这两个类,它们将各个jar的URL作为classpath中。你可能不需要建2个门面,如果对象的两组实现相同的接口。

更新

是,罐子不应该在主应用程序的classpath中。如果您设置了主应用程序的类加载器作为URLClassLoaders的父类,所加载的类仍然可以访问其余的类spath你的应用程序使用。

对于static如果它们是常量,它们可能会被编译器内联。对于静态变量,您将获得2,1加载的每个jar。如果这些变量在罐子上下文之外使用,您可能需要通过反射它们的类对象来访问它们。无论你需要选择一个还是另一个都取决于应用程序,我的猜测是,如果你可以在1个应用程序中加载和使用2个版本,那么任何静态变量只能用在各个jar的上下文中。

+0

为此工作我想我将不得不从应用程序的主要类路径,以便他们不自动加载隔离罐子。然而,静态成员和变量仍然存在问题,仍然可能会发生冲突。 – Newtopian 2010-08-12 19:13:19

+0

@Newtopian,查看更新。 – rsp 2010-08-12 20:39:14

相关问题