2

我的任务是更新Cytoscape的插件,一个生物可视化软件平台,到最新版本的 Cytoscape API。Cytoscape 3.x 使用 OSGI 框架(我认为是 Karaf 2.2.x)与其插件(现在称为“应用程序”)进行交互。

插件/应用程序实际上是一个使用 JAX-WS 与外部服务器通信的客户端。但是由于某种原因,尽管没有任何错误消息,但它无法解组它收到的 SOAP 消息。所需的对象是使用默认构造函数创建的,但它们的字段保持为空。

我可以确认 XML确实是从服务器到达的。我还可以确认相同的代码在非 OSGI 环境中也能正常工作。此外,为 OSGI 和非 OSGI 版本启用jaxb.debugJVM 选项表明 JAXB 在这两种情况下似乎在幕后做着完全相同的事情。

所以,我不知道这里发生了什么。有任何想法吗?

更新:

经过进一步调查,我确定该问题可能与 JAX-WS 没有任何直接关系。我将来自 Web 服务的 SOAP 消息作为 XML 文件保存在我的硬盘上。尝试直接解组它,根本不接触 Web 服务,导致以下情况:

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: javax.xml.stream.XMLInputFactory.newFactory()Ljavax/xml/stream/XMLInputFactory;

再一次,同样的代码在独立的非 OSGI 环境中运行良好。很奇怪。

4

2 回答 2

0

我想我找到了解决办法。

我将Apache ServiceMix Stax API 1.2 包添加到 Cytoscape OSGI 容器中,然后Import-Package将其javax.xml.stream包导入我自己的包中,确保需要 1.2 及更高版本。

似乎 Cytoscape 默认提供了一个过时的(Java 5?)版本javax.xml.stream.XMLInputFactory,这是我所有问题的根源。它实际上并没有使我的手动解组代码工作(仍然有一些奇怪的 API/实现版本不匹配会引发异常),但原始 Web 服务代码可以。

于 2014-02-17T15:49:48.933 回答
0

jdk 的内置 jaxws 支持与 OSGi 不兼容。

您可以尝试在 karaf 上安装 Apache CXF。它有一个 karaf 功能。所以安装非常简单。见http://liquid-reality.de/display/liquid/2011/12/22/Karaf+Tutorial+Part+4+-+CXF+Services+in+OSGi

于 2014-02-13T08:49:33.097 回答