首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RESTEasy Client + NoSuchMethodError

RESTEasy Client + NoSuchMethodError
EN

Stack Overflow用户
提问于 2014-06-10 10:49:00
回答 3查看 41.4K关注 0票数 18

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

代码语言:javascript
复制
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);

我在线上遇到了例外:

代码语言:javascript
复制
Client client = ClientBuilder.newBuilder().build();

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

代码语言:javascript
复制
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客户端依赖性如下:

代码语言:javascript
复制
  <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>3.0.8.Final</version>
  </dependency>

我的代码部署在JBossEAP6.1上。JDK版本为1.7。

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

代码语言:javascript
复制
  <listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
  </listener>

请查找以下maven受抚养人列表:

代码语言:javascript
复制
<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>

但它不起作用。

例外情况下,我无法弄清楚缺少了什么。我无法在这样或任何其他论坛上找到关于这一问题的任何参考资料。请让我知道,如果你见过这个问题,你知道如何解决它。谢谢。

2014年6月11日更新:

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

代码语言:javascript
复制
<?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>

但现在我看到其他方法也有类似的例外:

代码语言:javascript
复制
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:]

我看到了这一例外:

代码语言:javascript
复制
String value = response.readEntity(String.class);

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

进一步更新:

我指的是这个JBOSS问题跟踪器。但它与WildFly有关,而不是EAP服务器。它要求我们排除模块“javaee”。我试过排除“javaee”模块,但它也不起作用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-11 16:12:54

几天后,我终于能解决这些问题了。

问题1的解决办法:

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

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

代码语言:javascript
复制
<?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的解决办法:

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

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

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

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

票数 9
EN

Stack Overflow用户

发布于 2014-10-15 20:13:04

这个问题是导致应用程序和Jboss模块之间不同版本Resteasy客户端实现的原因。您使用的是最新版本的jaxrs-client,但是JBoss EAP 6.3.0使用的是非常老的版本(resteasy 2.3.8.final-redhat-3)。

只需下载最新的JBoss Resteasy实现包(如:resteasy-jboss 3.0.9.Final.zip)并解压缩到modules.xml文件夹中,替换现有文件modules.xml并添加新的jars。记住更换所有来自ZIP的罐子(不仅仅是resteasy-jaxrs)。

票数 9
EN

Stack Overflow用户

发布于 2021-05-27 14:53:18

更改jboss-deployment-structure.xml

代码语言:javascript
复制
<?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中的依赖项

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24139097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档