Axis2命名空间/类路径问题

Man*_*tra 7 java axis2 web-services wsdl2java xmlbeans

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

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

例如

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
Run Code Online (Sandbox Code Playgroud)

我可以毫无问题地为这些服务生成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服务产生不同版本的命名空间模型,现在导致编译时错误依赖于类路径顺序.那么......回到原点......

Ale*_*rov 2

我感觉每个 jar 中有两个版本的 GetAllMetersResponseDocument 。发生的情况是,它从相反的 jar 文件加载接口,最终导致类转换异常。我可能错了。

这就是为什么当您加载其中一个罐子时它会起作用的原因。

还有一个选项,您可以进行类加载器隔离,从而为两个 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