Axis2命名空间/类路径问题

时间:2018-08-14 19:41:15

标签: java web-services axis2 wsdl2java xmlbeans

我在一个Web应用程序上工作,该应用程序从其代码中调用多个Web服务客户端。

每个Web服务都有一些通用的名称空间,但是当我生成每个客户端时,我当前正在将这些名称空间映射到不同的包中

例如

Web服务1的命名空间1-> com.company.webservice.client1.service

Web服务2的命名空间1-> com.company.webservice.client2.service

其中namespace1引用相同的名称空间URL。

使用Wsdl2Java的namespace2package选项:

// Web Service Client 1's namespace parameter
--namespace2package http://www.multispeak.org/Version_3.0=com.company.webservice.client1.service

// Web Service Client 2's namespace parameter
--namespace2package http://www.multispeak.org/Version_3.0=com.company.webservice.client2.service

我可以毫无问题地为这些服务生成Web服务客户端代码,并且只要给定Web服务调用的类路径中只有一个生成的客户端jar,就可以自行调用每个客户端。但是,如果我将两个Web服务客户端jar都放在类路径上,则只有一个Web服务客户端可以工作(在类路径中其各自的客户端jar首先位于其中)。

另一个Web服务客户端尝试调用时失败,但以下情况除外:

  

java.lang.ClassCastException:com.company.webservice.client1.service.impl.GetAllMetersResponseDocumentImpl无法转换为com.company.webservice.client2.service.GetAllMetersResponseDocument

我已经混淆了上面的一些实际值。

因此,问题似乎与Axis2 / XMLBeans如何查找适当的类以匹配给定的XML进行解析有关。

我可以更改名称空间映射,以使它们彼此匹配,然后可以正常工作。但是,这样做的缺点是我有多个Web Service客户端jar,它们在相同的包结构中包含相同的生成代码,从而只能从其在类路径中找到的第一个客户端jar的模型中实例化这些类。

有没有办法做到这一点,以便为每个Web服务客户端jar保留不同的命名空间?

还是我只是被迫将每个名称空间映射到使用该名称空间的每个客户端的同一程序包?

希望这个问题有意义,但是如果我需要提供其他有帮助的信息,请告诉我,我将进一步详细介绍这个问题,但希望有人对使用Axis2 / XMLBeans / Web服务客户端生成有所了解Wsdl2Java应该能够在没有更多信息的情况下回答这个问题。

更新1: 我终于屈服了,只是使所有名称空间映射指向同一包,而不是为每个Web服务客户端定制,并因此在类路径上的各种JAR中具有同一类的多个副本。不如我所希望的那样优雅,但至少可以正常工作。

如果任何人都可以提出更好的解决方案,使我可以在每个客户端中使用定制副本,请告诉我。

更新2: 尽管使用相同的名称空间,这两种方法同样无法工作,因为这两个Web服务会产生不同版本的名称空间模型,从而导致依赖于类路径顺序的编译时错误。所以...回到第一个方块...

1 个答案:

答案 0 :(得分:3)

我觉得您在每个jar中都有两个版本的GetAllMetersResponseDocument。发生的是它正在从相反的jar文件加载接口,该文件最终导致Class cast异常。我可能是错的。

这是当您加载一个罐子时它可以工作的原因。

还有一个可以隔离类加载器的选项,这为两个jar提供了两个不同的类加载器,您可以再次得到两个无法强制转换的相同类型的对象。

UDATE 我实际上只是检查axis2是否默认定义了类加载器隔离,并且确实如此。 https://axis.apache.org/axis2/java/core/faq.html阅读类加载 问题

我相信同时阅读本文的服务和模块隔离也会对您有所帮助。 https://www.developer.com/open/article.php/10930_3589126_2/Avoiding-Mistakes-Made-Using-Axis2.htm