1

我有一堆生成的 SOAP 客户端存根,它们在 WSDL 版本之间有所不同。发生这种情况是因为 SOAP 服务器具有不同版本的 Web 服务。

Web 服务版本 1 的存根打包在 soap.stubs.version1 中,版本 2 的存根打包在 soap.stubs.version2 下。

这意味着 WSDL 版本 1 中的 MyStub 可能与版本 2 中的 MyStub 不同。因此,如果我调用返回 MyStub 版本 2 的 SOAP 方法并保存 MyStub 版本 1 中的值,它将“中断”,因为xml 响应无法正确映射到存根的属性。

因此,我需要将类类型与 SOAP 服务器相关联。

为每个版本复制逻辑是不可能的:

if(SoapServer.version==1)
{
   soap.subts.version1.MyStub result = SoapServer.getFoo();
   /* rest of the logic using result of type soap.subts.version1.MyStub */ 
}
else if(SoapServer.version==2)
{
   soap.subts.version2.MyStub result = SoapServer.getFoo();
   /* rest of the logic using result of type soap.subts.version2.MyStub */
}

每次我为较新版本生成存根时,我都需要复制所有逻辑以使用新存根。有时唯一改变的是一个属性。

因此,如何根据 SOAP 服务器使用正确的存根,而不必重新实现该“类”的所有逻辑?

我考虑过使用 Object ,但这需要分配 if instanceof 和 casts。

4

1 回答 1

0

我已经设法通过错误的 Java 反射和 URLClassLoader 解决了这个问题。我基本上做的是:

  • 根据服务器版本,我定义了从哪里获取 subts 的包名称
  • 使用 URLClassLoader 我加载正确的 .class 文件
  • 使用反射我调用正确的方法

This has the great advantage of Plug And Play SOAP Servers even with different stub versions. The only thing that must be constant between versions are the methods names so it's possible to fetch them through Class.getMethod.

于 2012-06-26T16:31:15.393 回答