RESTEasy Client + NoSuchMethodError

我正在尝试编写简单的RESTEasy客户端。 下面给出的是示例代码:

Client client = ClientBuilder.newBuilder().build(); WebTarget target = client.target("http://localhost:8080/context/path"); Response response = target.request().post(Entity.entity(object, "application/json")); //Read output in string format String value = response.readEntity(String.class); 

我在线上得到例外:

 Client client = ClientBuilder.newBuilder().build(); 

我在控制台中看到以下错误:

 16:07:57,678 ERROR [stderr] (http-localhost/127.0.0.1:8080-1) java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory.(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)V 16:07:57,679 ERROR [stderr] (http-localhost/127.0.0.1:8080-1) at org.jboss.resteasy.client.jaxrs.internal.ClientConfiguration.(ClientConfiguration.java:44) 16:07:57,680 ERROR [stderr] (http-localhost/127.0.0.1:8080-1) at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.build(ResteasyClientBuilder.java:317) 16:07:57,680 ERROR [stderr] (http-localhost/127.0.0.1:8080-1) at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.build(ResteasyClientBuilder.java:49) 

我在pom.xml中添加了resteasy客户端依赖性:

   org.jboss.resteasy resteasy-client 3.0.8.Final  

我的代码部署在JBOSS EAP 6.1上。 JDK版本是1.7。

更新:我还尝试在我的pom中添加resteasy jax-rs dependancy。 我还通过在web.xml中添加以下行来validation是否启用了ResteasyProviderFactory:

   org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap  

请在下面找到maven dependancies列表:

   org.jboss.spec.javax.ejb jboss-ejb-api_3.1_spec provided   javax.enterprise cdi-api provided   org.hibernate.javax.persistence hibernate-jpa-2.0-api provided   org.hibernate hibernate-validator provided   org.jboss.resteasy resteasy-jaxrs 3.0.8.Final provided   org.jboss.resteasy resteasy-client 3.0.8.Final   com.google.code.gson gson 2.2.4   junit junit test   org.jboss.arquillian.junit arquillian-junit-container test   org.jboss.arquillian.protocol arquillian-protocol-servlet test   

但它不起作用。

从例外情况来看,我无法弄清楚缺少什么。 我无法在SO或任何其他论坛上找到此问题的任何参考。 如果您之前已经看过这个问题并且您知道如何修复它,请告诉我。 谢谢。


2014年6月11日更新:

在参考了这个博客并排除了一些resteasy和jackson模块后,我尝试创建类似的jboss-deployment-structure.xml并将其保存在我的EJB项目的META-INF文件夹中。 这解决了我对“org.jboss.resteasy.spi.ResteasyProviderFactory。(Lorg / jboss / resteasy / spi / ResteasyProviderFactory;)”的NoSuchMethodError问题。 我的jboss-deployment-structure.xml的结构是:

        <!--  -->     <!--               -->    

但现在我看到其他方法的类似exception:

 Caused by: java.lang.NoSuchMethodError: javax.ws.rs.core.Response.readEntity(Ljava/lang/Class;)Ljava/lang/Object; at com.example.data.DemoProxyBean.callDemoTx(DemoProxyBean.java:59) [demo-service.jar:] at com.example.data.DemoProxyBean$Proxy$_$$_WeldClientProxy.callDemoTx(DemoProxyBean$Proxy$_$$_WeldClientProxy.java) [demo-service.jar:] 

我在行中看到了这个exception:

 String value = response.readEntity(String.class); 

奇怪的是,当我检查“response.readEntity(String.class)”时,在调试时,我可以看到String值。 但是当我尝试前往下一行时,我看到了这个错误。 你能指导我,可能是什么问题?

进一步更新:

我提到了这个JBOSS问题跟踪器 。 但它与WildFly有关,而与EAP服务器无关。 它要求我们排除模块“javaee-api”。 我尝试排除“javaee-api”模块,但它也不起作用。

由于您的应用程序和Jboss EAP模块之间的Resteasy客户端实现的版本不同,因此会引发此问题。 您使用的是最新版本的jaxrs-client,但JBoss EAP 6.3.0使用的是非常旧的版本(resteasy-jaxrs-2.3.8.Final-redhat-3)。

只需下载最新的JBoss Resteasy实现包(像这样:resteasy-jboss-modules-3.0.9.Final.zip)并解压缩到EAP Modules文件夹中,替换现有文件modules.xml并添加新的jar。 Remeber从ZIP中取代所有JARS(不仅仅是resteasy-jaxrs)。

最后,在敲了几天之后,我可以解决这些问题。


问题1的解决方案:

错误:“java.lang.NoSuchMethodError:org.jboss.resteasy.spi.ResteasyProviderFactory。(Lorg / jboss / resteasy / spi / ResteasyProviderFactory;)”

解决方案:我通过在jboss-deployment-structure.xml中的排除列表中添加更多resteasy模块解决了这个问题。 我目前的jboss-deployment-structure.xml状态如下:

                                                             

我相信,它可以通过简单地排除模块“org.jboss.resteasy.resteasy-jaxrs”和“org.jboss.resteasy.resteasy-cdi”来起作用。 但是当我遇到另一个问题时,我没有进一步尝试。 您可以尝试删除不必要的排除项。

问题2的解决方案:

错误:“由以下引起:java.lang.NoSuchMethodError:javax.ws.rs.core.Response.readEntity(Ljava / lang / Class;)Ljava / lang / Object;”

解决方案: JBOSS EAP 6.1捆绑了默认的resteasy发行版。 我从位置下载了最新的resteasy jax-rs实现(resteasy-jaxrs-3.0.7.Final-all.zip)。

它附带一个名为resteasy-jboss-modules-3.0.7.Final.zip的zip文件。 将此文件解压缩到JBoss EAP 6.1发行版的modules / system / layers / base /目录中。 这将覆盖那里的一些现有文件。 这将解决第二个问题。

希望这些信息能够帮助他人。