Axis2命名空间/类路径问题

问题描述 投票:7回答:1

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

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

EG

Web Service 1的namespace1 - > com.company.webservice.client1.service

Web Service 2的namespace1 - > 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服务客户端代码,只要生成的客户端jar中只有一个在给定Web服务调用的类路径上,我就可以自己调用每个客户端。但是,如果我将两个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服务客户端jar,这些类只能从它在类路径中找到的第一个客户端jar中的模型中实例化。

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

或者我只是被迫将每个命名空间映射到使用该命名空间的每个客户端的同一个包?

希望这个问题有意义,但是如果我需要提供其他任何有用的东西,请告诉我,我将进一步详细说明这个问题,但希望有使用Wsdl2Java的Axis2 / XMLBeans / web服务客户端生成知识的人应该是能够在没有更多信息的情况下回答这个

更新1:我终于放弃了,只是使所有的命名空间映射指向同一个包而不是每个Web服务客户端的定制,并且在类路径上的各个JAR中获得了同一个类的多个副本。不像我希望的那样优雅,但至少它有效。

如果有人能想出一个更好的解决方案,允许我在每个客户端使用定制副本,请告诉我。

更新2:这种方法同样不起作用,因为尽管使用相同的命名空间,两个Web服务产生不同版本的命名空间模型,现在导致编译时错误依赖于类路径顺序。那么......回到原点......

java web-services axis2 wsdl2java xmlbeans
1个回答
3
投票

我觉得你在每个jar中都有两个版本的GetAllMetersResponseDocument。发生的事情是它从相反的jar文件加载接口,最终出现在类转换异常中。我可能错了。

这就是为什么当你加载了一个罐子时它可以工作的原因。

还有这个选项,你可以让Classloader隔离,导致两个不同的类加载器,你可以再次使用两个相同类型的对象,这两个对象无法相互转换。

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

© www.soinside.com 2019 - 2024. All rights reserved.