【发布时间】:2012-08-28 06:46:24
【问题描述】:
我需要将 REST 客户端集成到使用 Apache Felix 实现的现有 OSGi 应用程序中。 REST 服务基于 JAX-RS 的 RESTeasy 实现(版本 2.3.2.Final)。我创建了一个包含客户端依赖项的单独包,导出所需的 RESTeasy 包并将它们导入到使用客户端的包中,但不幸的是我无法让它在 OSGi 上下文中工作。
我尝试了两种不同的方法。第一个使用通用 ClientRequest:
ClientRequest request = new ClientRequest(MyService.URL_TEST+"/stats");
request.body(javax.ws.rs.core.MediaType.APPLICATION_XML, stats);
ClientResponse<String> response = request.post(String.class);
在这种情况下我得到的错误很奇怪:
[java] java.lang.RuntimeException: java.lang.ClassCastException:
org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor cannot be cast to
org.jboss.resteasy.client.ClientExecutor
我确信 ApacheHttpClient4Executor 实现了 ClientExecutor 接口。
当我尝试像这样围绕 RESTeasy 使用自己的 REST 客户端包装器时:
MyService myService = MyServiceClient.getInstance();
myService.saveStatistics(stats);
我得到一个不同的例外:
[java] java.lang.LinkageError: ClassCastException: attempting to
castjar:file:/D:/Development/Eclipses/eclipse_4.2_j2ee_x64/lib/jaxrs-api-2.3.2.Final.jar
!/javax/ws/rs/ext/RuntimeDelegate.classtobundle:
//78.0:1/javax/ws/rs/ext/RuntimeDelegate.class
据我了解,LinkageError 很可能与 RESTeasy 使用一些类加载器技巧初始化 RuntimeDelegate 的方式有关,这可能属于 OSGi 框架的限制。我怀疑首先提到的 java.lang.ClassCastException 具有相同的来源。
有什么方法可以让 RESTeasy 在 OSGi 中工作?
PS:关于 RESTeasy 的类似问题的讨论,但在 OSGi 之外:java.lang.LinkageError: ClassCastException
更新: 这些是包含在 restclient 包中的库: 激活-1.1.jar commons-codec-1.2.jar commons-httpclient-3.1.jar commons-io-2.1.jar commons-logging-1.0.4.jar flexjson-2.1.jar httpclient-4.1.2.jar httpcore-4.1 .2.jar javassist-3.12.1.GA.jar jaxb-api-2.2.3.jar jaxb-impl-2.2.4.jar jaxrs-api-2.3.2.Final.jar jcip-annotations-1.0.jar 抛弃-1.3.1.jar jsr250-api-1.0.jar junit-4.10.jar log4j-1.2.14.jar resteasy-jaxb-provider-2.3.2.Final.jar resteasy-jaxrs-2.3.2.Final.jar resteasy -jettison-provider-2.3.2.Final.jar scannotation-1.0.3.jar slf4j-api-1.6.4.jar slf4j-log4j12-1.6.4.jar myservice-common-0.1.0.3.jar my-service- client-0.1.0.3-SNAPSHOT.jar stax-api-1.0-2.jar xmlpull-1.1.3.1.jar xpp3_min-1.1.4c.jar xstream-1.4.2.jar
这些是来自 restclient 包的 exports:javax.ws.rs、javax.ws.rs.ext、javax.ws.rs.core、org.jboss.resteasy.client、org .jboss.resteasy.client.cache, org.jboss.resteasy.client.extractors, org.jboss.resteasy.client.marshallers, org.jboss.resteasy.client.core.executors, javax.xml.bind.annotation, org .jboss.resteasy.plugins.providers、org.jboss.resteasy.plugins.providers.jaxb、org.jboss.resteasy.spi
【问题讨论】:
-
您的客户端捆绑包中包含哪些 jar?
-
到目前为止:myservice-client-0.1.0.3-SNAPSHOT.jar myservice-common-0.1.0.3.jar junit-4.10.jar javassist-3.12.1.GA.jar jcip-annotations- 1.0.jar jsr250-api-1.0.jar resteasy-jaxrs-2.3.2.Final.jar jaxrs-api-2.3.2.Final.jar 激活-1.1.jar commons-httpclient-3.1.jar
-
在我的 restclient 包中,我尝试导出 javax.ws.rs、javax.ws.rs.ext、javax.ws.rs.core、org.jboss.resteasy.client、org. jboss.resteasy.client.core.executors 除了我自己的 myservice-common 类
-
大概那些 resteasy jars 也存在于其他一些包或 jvm 的其他地方?
-
嗯...是的,我也觉得这可能是原因。我刚刚完成了对项目内部任何出现的 javax.ws.* RESTeasy 的广泛搜索,并且只找到了包含在我的 resteasy 包中并由我自己使用的那些。除了 restclient 之外,我还提取了所有最终捆绑的 jar 并在那里搜索 - 什么也没找到。我什至尝试在 Eclipse 之外运行以排除任何类路径魔法的可能性 - 得到了相同的结果。
标签: java web-services osgi resteasy apache-felix