【问题标题】:RESTEasy Client + NoSuchMethodErrorRESTEasy 客户端 + NoSuchMethodError
【发布时间】:2014-06-10 10:49:00
【问题描述】:

我正在尝试编写简单的 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.<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)

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

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

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

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

  <listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
  </listener>

请在下面找到 maven 依赖项列表:

<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>

但它不起作用。

从异常中,我无法弄清楚缺少什么。我无法在 SO 或任何其他论坛上找到有关此问题的任何参考资料。请让我知道,如果您之前已经看到此问题并且您知道如何解决它。 谢谢。


2014 年 6 月 11 日更新:

引用this blog 并排除一些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>

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

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:]

我在以下行看到了这个异常:

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

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

进一步更新:

我提到了这个JBOSS Issue tracker。但它与 WildFly 相关,而不是 EAP 服务器。它要求我们排除模块“javaee-api”。我尝试排除“javaee-api”模块,但它也不起作用。

【问题讨论】:

  • 看起来您在类路径中有不同版本的resteasy-client,或者您在编译运行时版本之间存在差异。
  • 我尝试从我的 pom.xml 中评论 resteasy-client 依赖。它给出了编译错误。所以我猜类路径中只有一个版本的 resteasy-client jar。
  • 在编译时和运行时?你的 jboss 的类路径中有多个版本吗?
  • 如果我尝试删除 resteasy-client 依赖 eclipse 会说它无法找到像 ClientBuilder 这样的类。并且没有其他 jar 可以从中导入它们。
  • 我已经通过更多分析和当前状态进一步更新了问题。如果您对确切问题有任何想法,请告诉我。

标签: java maven resteasy jboss6.x nosuchmethoderror


【解决方案1】:

这个问题是由于您的应用程序和 Jboss EAP 模块之间的 Resteasy Client 实现版本不同而引发的。您正在使用最新版本的 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。记住替换 ZIP 中的所有 JARS(不仅是 resteasy-jaxrs)。

【讨论】:

    【解决方案2】:

    在我头疼了几天之后,我终于可以解决这些问题了。


    问题 1 的解决方案:

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

    解决方案:我通过在 jboss-deployment-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>
    

    我相信,它可以通过简单地排除模块“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 发行版捆绑在一起。我从location 下载了最新的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/ 目录中解压这个文件。这将覆盖那里的一些现有文件。这将解决第二个问题。

    希望这些信息对其他人有所帮助。

    【讨论】:

    • #2 是我的确切问题。我正在使用 3.0.8.Final 并且需要使用 3.0.7.Final。
    • 每个人都有关于 JBoss 服务器的问题。虽然我的问题是在 Eclipse 中执行集成测试。
    【解决方案3】:

    更改 jboss-deployment-structure.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure
        xmlns="urn:jboss:deployment-structure:1.2"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <deployment>
            <dependencies>
                <module name="javaee.api">
                    <imports>
                        <exclude-set>
                            <path name="javax/ws/rs" />
                            <path name="javax/ws/rs/core" />
                            <path name="javax/ws/rs/ext" />
                        </exclude-set>
                    </imports>
                </module>
            </dependencies>
            <exclude-subsystems>
                <subsystem name="jaxrs" />
            </exclude-subsystems>
            <exclusions>
                <module name="org.jboss.as.jaxrs" />
                <module name="javaee.api" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure>
    

    使用 pom.xml 中的依赖项

    <dependency>
     <groupId>org.jboss.resteasy</groupId>
     <artifactId>resteasy-jaxrs</artifactId>
     <version>3.0.9.Final</version>
    </dependency>
    <dependency>
     <groupId>org.jboss.resteasy</groupId>
     <artifactId>resteasy-servlet-initializer</artifactId>
     <version>3.0.9.Final</version>
    </dependency>
    <dependency>
     <groupId>org.jboss.resteasy</groupId>
     <artifactId>resteasy-jackson-provider</artifactId>
     <version>3.0.9.Final</version>
    </dependency>
    <dependency>
     <groupId>org.jboss.resteasy</groupId>
     <artifactId>resteasy-cdi</artifactId>
     <version>3.0.9.Final</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2017-09-23
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多