【发布时间】:2012-03-31 16:31:50
【问题描述】:
我们正在我们的项目中执行 POC,其中我们发送基于 SOAP 的请求并相应地从 Web 服务获取 SOAP 响应。我们的目标是在我们的应用程序中利用 Spring 框架提供的 Web 服务模板(客户端 API)。根据我们的架构,我们创建了一个符合 OSGI 的包(用于我们使用 web 服务模板 API 与 web 服务交互的代码),然后将其部署到 Apache Felix 容器中。我们还在 Felix 容器中安装了所有依赖的 OSGI 兼容包,以便解析所有依赖项。
根据 webservices 模板,默认的 Web 服务消息发送器是 HttpUrlConnectionMessageSender,它由类加载器在运行时动态加载。根据我的理解,我们得到了以下异常,因为 Felix 容器无法从依赖的 OSGI 包中加载类(Web 服务包包含 HttpUrlConnectionMessageSender)。请参阅下面的异常日志。
* org.springframework.beans.factory.BeanInitializationException: Could not find default strategy class for interface [org.springframework.ws.transport.WebServiceMessageSender]; nested exception is java.lang.ClassNotFoundException:org.springframework.ws.transport.http.HttpUrlConnectionMessageSender at org.springframework.ws.support.DefaultStrategiesHelper.getDefaultStrategies(DefaultStrategiesHelper.java:126)
at org.springframework.ws.support.DefaultStrategiesHelper.getDefaultStrategies(DefaultStrategiesHelper.java:90)
at org.springframework.ws.client.core.WebServiceTemplate.initMessageSenders(WebServiceTemplate.java:320)
at org.springframework.ws.client.core.WebServiceTemplate.initDefaultStrategies(WebServiceTemplate.java:306)
at org.springframework.ws.client.core.WebServiceTemplate.<init>(WebServiceTemplate.java:143)
at test.soapservice.service.SOAPServiceImpl.<init>(SOAPServiceImpl.java:40)
at test.soapservice.service.SOAPServiceActivator.start(SOAPServiceActivator.java:17)
at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:641)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)
at org.apache.felix.gogo.command.Basic.start(Basic.java:729)
原因:java.lang.ClassNotFoundException: org.springframework.ws.transport.http.HttpUrlConnectionMessageSender
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:211)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:164)
at org.springframework.ws.support.DefaultStrategiesHelper.getDefaultStrategies(DefaultStrategiesHelper.java:114)
据我了解,Felix 容器无法使用存在于另一个包中的 ClassUtils.forName() 动态加载类。我认为这是一个协作问题,当前包具有不同的类加载器,而不是依赖包的类加载器。
这个社区的人是否遇到过同样的异常?如果是,那么您采取了哪些步骤来解决运行时类依赖性?请分享您的想法/建议以解决上述问题。我们将非常感谢您的快速回复,这可能有助于我们成功地完成 POC。
提前致谢, 穆里杜尔乔普拉
【问题讨论】:
-
您确定将
org.springframework.ws.transport.http添加到清单中了吗? -
按名称加载类根本不是问题,请注意您不能使用字节码检查工具 (bnd) 来生成清单。正如 artbristol 所说,您需要自定义清单并导入
org.springframework.ws.transport.http。你能出示你的清单吗?