如何同时使用不同版本的相同类

时间:2010-08-12 16:14:28

标签: java xsd wsdl cxf

我必须为一组Web服务提供一个接口,我已经为其生成了代码存根和对象绑定。许多事务共享一个共同的对象模型,因此生成的代码的很大一部分重叠。通常这不会引起关注,因为我会重新使用相同的代码,因为wsdl会链接相同的xsd文件。

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

问题如下:

我如何在同一个程序中集成这些不同的生成类集,以便每个服务在不干扰他们的兄弟的情况下公开其功能?

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

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

感谢

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

通常,处理此问题的最简单方法是使用jaxb绑定文件(或CXF的wsdl2java工具的-p param)将生成的代码映射到特定于特定服务的包中。因此,每个服务都有自己的对象可供使用。

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

答案 2 :(得分:0)

对于Java,当两个类由不同的类加载器加载时,它们彼此不同。你可以通过自己从2个URLClassLoaders加载类的2个版本来获得这个优势,它们将相应jar的URL作为类路径获取。如果两组对象都实现相同的接口,则可能不需要构建2个外观。

<强>更新

是的,罐子不应该在主应用程序的类路径上。如果将主应用程序的类加载器设置为URLClassLoaders的父类,则加载的类仍然可以访问应用程序使用的其余类路径。

对于static s,如果它们是常量,它们可能会由编译器内联。对于静态变量,每个加载的jar都会得到2,1。如果这些变量在jar的上下文之外使用,则可能必须通过反映其类对象来访问它们。另外,你需要选择一个或者将它们组合起来取决于应用程序,如果你可以在1个应用程序中加载和使用2个版本,那么任何静态变量只能在相应的jar的上下文中使用。