当前位置: 首页 > 知识库问答 >
问题:

Axis2名称空间/类路径问题

东郭宏深
2023-03-14

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

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

e. g. g.

Web服务1的名称空间1-

Web 服务 2 的命名空间1 -

其中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.GetAllMeters响应文档

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

因此,问题似乎在于 Axis2/XMLBeans 如何查找适当的类以匹配要从中解析的给定 XML。

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

有没有一种方法可以这样做,以便我可以为每个web服务客户端jar保留不同的名称空间?

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

希望这个问题是有意义的,但如果我需要提供任何其他帮助,请让我知道,我将用更多的细节来扩展这个问题,但希望了解使用Wsdl2Java生成Axis2/XMLBeans/web服务客户端的人应该能够回答这个问题,而不需要更多的信息。

更新1:我终于让步了,只是让所有的命名空间映射指向同一个包,而不是按web服务客户端定制,并在类路径上的不同JAR中拥有同一类的多个副本。虽然没有我想的那么优雅,但至少它能起作用。

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

UPDATE 2:这种方法同样不起作用,因为两个Web服务,尽管使用相同的命名空间,但会产生不同版本的命名空间模型,这现在会导致编译时错误,具体取决于类路径顺序。所以…回到起点…

共有1个答案

高修筠
2023-03-14

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

这就是当你装了一个罐子时它会起作用的原因。

还有此选项,您可以在其中进行类加载器隔离,从而为两个 jar 生成两个不同的类加载器,您可能再次得到两个无法相互强制转换的相同类型的对象。

UDATEI实际上只是检查了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

 类似资料:
  • 我对C++不是很熟悉,这是我第一次使用的不仅仅是名称空间std。下面的有什么区别? VS 在这两个之后,我现在似乎可以创建一个MyClass对象了。一种方式比另一种好吗?另外,如果我都不这样做,我还可以通过每次需要时在MyNamespace::MyClass之前附加MyClass来引用MyClass吗? 接下来,如果我使用第二个选项转发declare,我还需要吗?在我(不是很好)的理解中,在C++

  • 问题内容: 我正在从源头解析XML文档,并且它们使用自定义名称空间。 例如。当我使用SimpleXML进行解析时,mostix:名称空间元素均未显示或不可访问。可能是一个非常简单的解决方案,但是有什么想法吗? 问题答案: 通常,人们使用children()。

  • 在OpenFOAM中,存在一个函数,其名称为exp,表示数学中的幂操作。同时,C++本身也可以进行这个计算,并且函数名称也为exp。这会导致调用的时候,编译器并不知道应该调用OpenFOAM的exp还是C++本身的exp。一种方法是将其中一个exp函数进行改名,比如将OpenFOAM中的exp改成expFoam。但还有更简单的方式。 名称空间专门用于解决上面的问题,它可作为附加信息来区分不同库中相

  • 我是XML新手。这是一个家庭作业。我已经尽了最大努力,但我无法让实例文档进行验证。我总是犯错误 “找不到元素'站点'的声明。 我想我可能错误地声明了一些名称空间或者schemaLocations。有人能给我指一下正确的方向吗? 作业步骤: > <块引用> 在sites.xml文件中,向根站点元素添加命名空间声明,将xs前缀与XML Schema命名空间的URI相关联。为文件指定默认命名空间http

  • 在marshall一个JAXB类之后,我有下面的XML: 这个 它可能包含未知数量的具有自己名称空间的其他元素。 问题: 当我马歇尔的一些。类对象,jaxb将另一个的名称空间。类作为ns0导入根元素,因为我得到 这是一个问题,因为 我需要@XmlElementRefs和@XmlElementRef注释,因为我需要从json转换为XML,并且Jackson需要知道“任何”列表可能具有的类型。 我如何

  • 问题内容: 想知道是否有人在使用新功能通过PHP 5.3对类进行命名空间时是否遇到了此问题。 我正在使用单独的类来生成动态类调用,以在应用程序中定义用户类型。基本上,类定义器采用类型的整数表示形式并解释它们,返回一个包含要用作该用户模型的类名的字符串。 我在全局范围内定义了具有该名称的用户类型的对象模型,但是在Editor名称空间中,该用户的编辑器具有另一个名称相同的对象。由于某些原因,PHP不允