Axis2 Namespace/Classpath 问题
Axis2 Namespace/Classpath Issue
我开发的 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 服务客户端代码,我可以自己调用每个客户端,只要生成的客户端 jar 文件中只有一个在给定的 class 路径上网络服务调用。但是,如果我将两个 Web 服务客户端 jar 都放在 class 路径上,则只有一个 Web 服务客户端可以工作(其各自的客户端 jar 位于 class 路径的第一个)。
另一个 Web 服务客户端在尝试调用它时失败,出现以下异常:
java.lang.ClassCastException: com.company.webservice.client1.service.impl.GetAllMetersResponseDocumentImpl cannot be cast to com.company.webservice.client2.service.GetAllMetersResponseDocument
我混淆了上面的一些实际值。
所以,问题似乎是关于 Axis2/XMLBeans 如何查找合适的 class 来匹配给定的 XML 以进行解析。
我可以更改命名空间映射,使它们相互匹配,之后就可以正常工作了。然而,这样做的缺点是我有多个 Web 服务客户端 jar,它们在相同的包结构中包含相同的生成代码,因此这些 classes 只会从它在class路径。
有没有办法做到这一点,以便我可以为每个 Web 服务客户端 jar 保留不同的命名空间?
或者我只是被迫将每个命名空间映射到使用该命名空间的每个客户端的同一个包?
希望这个问题有意义,但如果我需要提供任何其他帮助,请告诉我,我会用更多细节扩展这个问题,但希望有人了解 Axis2/XMLBeans/web使用 Wsdl2Java 的服务客户端生成应该能够在没有更多信息的情况下回答这个问题。
更新 1:
我终于屈服了,只是让所有的命名空间映射都指向同一个包,而不是为每个 Web 服务客户端定制,并且在 class 的各种 JAR 中拥有相同 class 的多个副本。小路。没有我想要的那么优雅,但至少它有效。
如果有人能提出更好的解决方案,让我可以在每个客户端中使用定制副本,请告诉我。
更新 2:
这种方法同样不起作用,因为这两个 Web 服务尽管使用相同的命名空间,但会生成不同版本的命名空间模型,这现在会导致依赖于 class 路径顺序的编译时错误。所以...回到正题...
我感觉每个罐子里都有两个版本的 GetAllMetersResponseDocument。正在发生的事情是它正在从相反的 jar 文件加载接口,最终导致 Class 强制转换异常。我可能是错的。
这就是为什么当您加载其中一个 jar 时它会起作用的原因。
还有这个选项,您可以在其中进行 Classloader 隔离,从而为两个 jar 生成两个不同的类加载器,您最终可能会得到两个相同类型的对象,它们不能分别转换为其他.
更新
我实际上只是检查了 axis2 是否具有默认定义的类加载器隔离,它确实如此。 https://axis.apache.org/axis2/java/core/faq.html 阅读 Class 加载中
问题
我相信阅读本文中的服务和模块隔离也会对您有所帮助。
https://www.developer.com/open/article.php/10930_3589126_2/Avoiding-Mistakes-Made-Using-Axis2.htm
我开发的 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 服务客户端代码,我可以自己调用每个客户端,只要生成的客户端 jar 文件中只有一个在给定的 class 路径上网络服务调用。但是,如果我将两个 Web 服务客户端 jar 都放在 class 路径上,则只有一个 Web 服务客户端可以工作(其各自的客户端 jar 位于 class 路径的第一个)。
另一个 Web 服务客户端在尝试调用它时失败,出现以下异常:
java.lang.ClassCastException: com.company.webservice.client1.service.impl.GetAllMetersResponseDocumentImpl cannot be cast to com.company.webservice.client2.service.GetAllMetersResponseDocument
我混淆了上面的一些实际值。
所以,问题似乎是关于 Axis2/XMLBeans 如何查找合适的 class 来匹配给定的 XML 以进行解析。
我可以更改命名空间映射,使它们相互匹配,之后就可以正常工作了。然而,这样做的缺点是我有多个 Web 服务客户端 jar,它们在相同的包结构中包含相同的生成代码,因此这些 classes 只会从它在class路径。
有没有办法做到这一点,以便我可以为每个 Web 服务客户端 jar 保留不同的命名空间?
或者我只是被迫将每个命名空间映射到使用该命名空间的每个客户端的同一个包?
希望这个问题有意义,但如果我需要提供任何其他帮助,请告诉我,我会用更多细节扩展这个问题,但希望有人了解 Axis2/XMLBeans/web使用 Wsdl2Java 的服务客户端生成应该能够在没有更多信息的情况下回答这个问题。
更新 1: 我终于屈服了,只是让所有的命名空间映射都指向同一个包,而不是为每个 Web 服务客户端定制,并且在 class 的各种 JAR 中拥有相同 class 的多个副本。小路。没有我想要的那么优雅,但至少它有效。
如果有人能提出更好的解决方案,让我可以在每个客户端中使用定制副本,请告诉我。
更新 2: 这种方法同样不起作用,因为这两个 Web 服务尽管使用相同的命名空间,但会生成不同版本的命名空间模型,这现在会导致依赖于 class 路径顺序的编译时错误。所以...回到正题...
我感觉每个罐子里都有两个版本的 GetAllMetersResponseDocument。正在发生的事情是它正在从相反的 jar 文件加载接口,最终导致 Class 强制转换异常。我可能是错的。
这就是为什么当您加载其中一个 jar 时它会起作用的原因。
还有这个选项,您可以在其中进行 Classloader 隔离,从而为两个 jar 生成两个不同的类加载器,您最终可能会得到两个相同类型的对象,它们不能分别转换为其他.
更新 我实际上只是检查了 axis2 是否具有默认定义的类加载器隔离,它确实如此。 https://axis.apache.org/axis2/java/core/faq.html 阅读 Class 加载中 问题
我相信阅读本文中的服务和模块隔离也会对您有所帮助。 https://www.developer.com/open/article.php/10930_3589126_2/Avoiding-Mistakes-Made-Using-Axis2.htm