Клиент RESTEasy + 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.<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)

Я добавил зависимость клиента resteasy в pom.xml как:

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

Мой код развернут на JBOSS EAP 6.1. Версия JDK - 1.7.

Обновление: Я также попытался добавить зависимость jax-rs resteasy в моем пом. Я также проверял, включен ли ResteasyProviderFactory, добавив следующие строки в мой web.xml:

  <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 или на любых других форумах. Пожалуйста, дайте мне знать, если вы видели эту проблему раньше, и знаете, как ее исправить. Спасибо.


Обновление 11 июня 2014 года:

После ссылки этого блога и, исключая некоторые модули resteasy и jackson, я попытался создать похожий jboss-deployment-structure.xml и сохранить его в META-INF в моем проекте EJB. Это решило мою проблему NoSuchMethodError для "org.jboss.resteasy.spi.ResteasyProviderFactory. (Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)". Структура моего 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)", во время отладки я могу увидеть значение String. Но когда я пытаюсь перейти к следующей строке, я вижу эту ошибку. Можете ли вы, пожалуйста, направить меня, что может быть проблемой?

Дальнейшее обновление:

Я упомянул об этом JBOSS Issue tracker. Но это было связано с WildFly, а не с сервером EAP. Он просит нас исключить модуль "javaee-api". Я попробовал исключить модуль "javaee-api", но он также не работает.

Ответы

Ответ 1

Наконец, после нескольких ударов головой, я мог решить эти проблемы.


Решение для проблемы 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:

Ошибка: "Caused by: java.lang.NoSuchMethodError: javax.ws.rs.core.Response.readEntity(Ljava/lang/Class;) Ljava/lang/Object;"

Решение: JBOSS EAP 6.1, поставляется с дистрибутивом по умолчанию. Я загрузил последнюю реализацию jax-rs resteasy (resteasy-jaxrs-3.0.7.Final-all.zip) из location.

Он поставляется с zip файлом, называемым resteasy-jboss-modules-3.0.7.Final.zip. Распакуйте этот файл внутри каталога modules/system/layers/base/каталога дистрибутива JBoss EAP 6.1. Это перезапишет некоторые из существующих файлов. Это решит вторую проблему.

Надеюсь, эта информация поможет другим.

Ответ 2

Эти проблемы вызвали разную версию реализации клиента Resteasy Client между вашим приложением и модулями Jboss EAP. Вы используете самую новую версию 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.xml и добавив новые банки. Remeber заменит все JARS из ZIP (не только resteasy-jaxrs).