【问题标题】:strange interaction with Axis & OSGi与 Axis 和 OSGi 的奇怪交互
【发布时间】:2010-12-30 21:57:00
【问题描述】:

这是场景:

我有 2 个轴 1.4 的捆绑包,其中嵌入了传递依赖项(它们各自调用不同的 Web 服务来完成它们的工作)。

似乎当一个包先于另一个加载时,另一个包“丢失”,但有以下例外:

java.lang.RuntimeException: java.lang.ClassCastException: org.apache.axis.transport.http.HTTPSender cannot be cast to org.apache.axis.Handler

我已经深入研究了轴代码,看起来它实际上正在执行一些与 OSGi 不兼容的类加载(Class.forName 类型的东西),但是因为轴嵌入在两个包中(以及每个包有它自己的类加载器)我不明白为什么它们会成为问题。

这里有更多的例外:

Caused by: java.lang.ClassCastException: org.apache.axis.transport.http.HTTPSender cannot be cast to org.apache.axis.Handler
    at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:216)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at com.mycompany.myappname.webserviceclient.MyAppNameWebservicePortBindingStub.getAllSiteInformations(MyAppNameWebservicePortBindingStub.java:1603)
    at com.mycompany.myappname.webserviceclient.MyAppNameWebserviceProxy.getAllSiteInformations(MyAppNameWebserviceProxy.java:164)
    at com.mycompany.application.myappnamedisplay.view.MetadataTreeCompositeHolder.buildMetadataTree(MetadataTreeCompositeHolder.java:102)
    ... 51 more
Caused by: java.lang.ClassCastException: org.apache.axis.transport.http.HTTPSender cannot be cast to org.apache.axis.Handler
    at org.apache.axis.deployment.wsdd.WSDDTargetedChain.makeNewInstance(WSDDTargetedChain.java:157)
    at org.apache.axis.deployment.wsdd.WSDDDeployableItem.getNewInstance(WSDDDeployableItem.java:274)
    at org.apache.axis.deployment.wsdd.WSDDDeployableItem.getInstance(WSDDDeployableItem.java:260)
    at org.apache.axis.deployment.wsdd.WSDDDeployment.getTransport(WSDDDeployment.java:410)
    at org.apache.axis.configuration.FileProvider.getTransport(FileProvider.java:257)
    at org.apache.axis.AxisEngine.getTransport(AxisEngine.java:332)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:163)
    ... 59 more

我已经用谷歌搜索了很多,但似乎找不到任何东西 - 我几乎希望在这里获得另一个风滚草徽章,但也许​​有人知道这里发生了什么?

提前致谢。

【问题讨论】:

  • Axis 1 和 OSGi... 现在天作之合。为什么不使用本世纪编写的 Web 服务堆栈?
  • 我完全同意——我真的很鄙视 Axis,但是...我尝试使用其他 Web 服务客户端,但没有成功。我有一个悬而未决的问题here,如果你能帮助我减轻被称为轴的痛苦。
  • 或者如果您愿意,我很乐意提出一个关于如何生成 java Web 服务客户端 WITHOUT 轴的新问题。
  • 所以只需使用 CXF(或 Java6 JAX-WS),不要使用所有 Eclipse 垃圾。手动配置很简单。
  • 在两个包中嵌入 Axis 可能是问题的根源。看起来org.apache.axis.Handler 类正在由两个包的类加载器加载,但您正在它们之间传递子类实例。如果由不同的类加载器加载,类是不相等的(即使它们是“相同的”类)。抱歉,这不是一个明确而明确的答案(因此仅作为评论发布)。但它可能会帮助你开始寻找答案。

标签: java web-services osgi axis


【解决方案1】:

从 cmets 看来,将 jar 嵌入包中是行不通的。通过这篇文章,我们可以通过更改一些 Axis 1.4 源代码使 Axis 1.4 作为一个捆绑包工作:http://issues.ops4j.org/browse/PAXLOGGING-58

我们还从 springsource Axis 中获取了 MANIFEST.MF,并将其放入新编译的 Axis JAR 中。我们这样做而不是通过 BND 运行它并尝试配置所有可选依赖项。 http://nl.interface21.com/repository/app/bundle/version/detail?name=com.springsource.org.apache.axis&version=1.4.0

(注意:我们不使用 Pax 日志记录,而是使用 Sling 记录器,上面的更改对我们来说很好。它们修复了 Axis 如何从 commons-logging 兼容框架获取 Logger,这似乎破坏了 Axis 1.4 在 OSGi 中。)

我们使用的环境:Day CQ 5.3.0,Felix OSGi 容器。

【讨论】:

  • 这很有趣。如果我有任何愿望让它与 Axis 一起工作,我会回去试试这个。但此时我已经转向 CXF。实际上,您可以将 CXF 作为一个独立的捆绑包获得,无需构建任何依赖项,并且可以直接从他们的网站上下载。它相当大(尺寸明智),但我发现它是值得的。感谢您的发帖,+1。
  • 您有 Axis OSGI 捆绑包的源代码吗?我和作者有完全相同的问题,我正在尝试找到一个可以导入到 Eclipse 工作区中的项目,以将这个 Axis1 Bundle 与我的其他包一起构建,以便我可以设置依赖项。
  • 好的,我在这里看到了一个带有捆绑包的 p2 存储库:download.eclipse.org/tools/orbit/downloads/drops/…,但仍然需要找出所需捆绑包的链。啊……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多