RESTEasy Client + NoSuchMethodError

use*_*114 15 java nosuchmethoderror resteasy maven jboss6.x

我正在尝试编写简单的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);
Run Code Online (Sandbox Code Playgroud)

我在线上得到例外:

Client client = ClientBuilder.newBuilder().build();
Run Code Online (Sandbox Code Playgroud)

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

16:07:57,678 ERROR [stderr] (http-localhost/127.0.0.1:8080-1) java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory.<init>(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.<init>(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)
Run Code Online (Sandbox Code Playgroud)

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

  <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>3.0.8.Final</version>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

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

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

  <listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
  </listener>
Run Code Online (Sandbox Code Playgroud)

请在下面找到maven dependancies列表:

<dependencies>

    <dependency>
        <groupId>org.jboss.spec.javax.ejb</groupId>
        <artifactId>jboss-ejb-api_3.1_spec</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>3.0.8.Final</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>3.0.8.Final</version>
    </dependency>

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.4</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.arquillian.protocol</groupId>
        <artifactId>arquillian-protocol-servlet</artifactId>
        <scope>test</scope>               
    </dependency>

</dependencies>
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

从例外情况来看,我无法弄清楚缺少什么.我无法在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的结构是:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
   <deployment>
       <exclude-subsystems>
           <subsystem name="resteasy"/>
       </exclude-subsystems>
     <exclusions>
       <!-- <module name="org.apache.log4j" /> -->
       <module name="org.apache.commons.logging"/>
       <module name="org.jboss.as.jaxrs"/>
       <module name="org.jboss.resteasy.resteasy-jaxrs"/>
       <module name="org.jboss.resteasy.resteasy-cdi"/>
       <!-- <module name="org.jboss.resteasy.jackson-provider"/>
       <module name="org.jboss.resteasy.resteasy-atom-provider"/>
       <module name="org.jboss.resteasy.resteasy-hibernatevalidator-provider"/>
       <module name="org.jboss.resteasy.resteasy-jaxb-provider"/>
       <module name="org.jboss.resteasy.resteasy-jettison-provider"/>
       <module name="org.jboss.resteasy.resteasy-jsapi"/>
       <module name="org.jboss.resteasy.resteasy-multipart-provider"/>
       <module name="org.jboss.resteasy.resteasy-yaml-provider"/>
       <module name="org.codehaus.jackson.jackson-core-asl"/>
       <module name="org.codehaus.jackson.jackson-jaxrs"/>
       <module name="org.codehaus.jackson.jackson-mapper-asl"/>
       <module name="org.codehaus.jackson.jackson-xc"/>
       <module name="org.codehaus.jettison"/>
       <module name="javax.ws.rs.api"/> -->
     </exclusions>
   </deployment>
 </jboss-deployment-structure>
Run Code Online (Sandbox Code Playgroud)

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

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:]
Run Code Online (Sandbox Code Playgroud)

我在线看到这个例外:

String value = response.readEntity(String.class);
Run Code Online (Sandbox Code Playgroud)

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

进一步更新:

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

小智 9

由于您的应用程序和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).


use*_*114 8

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


问题1的解决方案:

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

解决方案:我解决了这个问题,由jboss-部署,structure.xml内的排除列表中添加更多的RestEasy的模块.我目前的jboss-deployment-structure.xml状态如下:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
   <deployment>
      <dependencies>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" services="import"/>
       </dependencies>
       <exclude-subsystems>
           <subsystem name="resteasy"/>
       </exclude-subsystems>
     <exclusions>
        <module name="javax.activation.api"/>
        <module name="javax.annotation.api"/>
        <module name="javax.ejb.api"/>
        <module name="javax.el.api"/>
        <module name="javax.enterprise.api"/>
        <module name="javax.enterprise.deploy.api"/>
        <module name="javax.inject.api"/>
        <module name="javax.interceptor.api"/>
        <module name="javax.jms.api"/>
        <module name="javax.jws.api"/>
        <module name="javax.mail.api"/>
        <module name="javax.management.j2ee.api"/>
        <module name="javax.persistence.api"/>
        <module name="javax.resource.api"/>
        <module name="javax.rmi.api"/>
        <module name="javax.security.auth.message.api"/>
        <module name="javax.security.jacc.api"/>
        <module name="javax.servlet.api"/>
        <module name="javax.servlet.jsp.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.ws.rs.api"/>
        <module name="javax.xml.bind.api"/>
        <module name="javax.xml.registry.api"/>
        <module name="javax.xml.soap.api"/>
        <module name="javax.xml.ws.api"/>

        <!-- This one always goes last. -->
        <module name="javax.api"/>

       <module name="org.apache.commons.logging"/>
       <module name="org.jboss.as.jaxrs"/>
       <module name="org.jboss.resteasy.resteasy-jaxrs"/>
       <module name="org.jboss.resteasy.resteasy-cdi"/>
       <module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
       <module name="org.jboss.resteasy.jackson-provider"/>
       <module name="org.jboss.resteasy.resteasy-atom-provider"/>
       <module name="org.jboss.resteasy.resteasy-hibernatevalidator-provider"/>
       <module name="org.jboss.resteasy.resteasy-jaxb-provider"/>
       <module name="org.jboss.resteasy.resteasy-jettison-provider"/>
       <module name="org.jboss.resteasy.resteasy-jsapi"/>
       <module name="org.jboss.resteasy.resteasy-multipart-provider"/>
       <module name="org.jboss.resteasy.resteasy-yaml-provider"/>
       <module name="org.codehaus.jackson.jackson-core-asl"/>
       <module name="org.codehaus.jackson.jackson-jaxrs"/>
       <module name="org.codehaus.jackson.jackson-mapper-asl"/>
       <module name="org.codehaus.jackson.jackson-xc"/>
       <module name="org.codehaus.jettison"/>
       <module name="javax.ws.rs.api"/>
       <module name="javax.ws.rs.core"/>
     </exclusions>
   </deployment>
 </jboss-deployment-structure>
Run Code Online (Sandbox Code Playgroud)

我相信,它可以通过简单地排除模块"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 /目录中.这将覆盖那里的一些现有文件.这将解决第二个问题.

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