web-dev-qa-db-fra.com

Client RESTEasy + NoSuchMethodError

J'essaie d'écrire un client RESTEasy simple. Ci-dessous, voici un exemple de code:

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

Je reçois une exception à la ligne:

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

Je vois les erreurs suivantes dans ma console:

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)

J'ai ajouté une dépendance client reposante dans pom.xml comme:

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

Mon code est déployé sur JBOSS EAP 6.1. La version JDK est 1.7.

Mise à jour: J'ai également essayé d'ajouter une dépendance jax-rs resteasy dans mon pom. J'ai également vérifié si ResteasyProviderFactory est activé en ajoutant les lignes suivantes dans mon web.xml:

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

Veuillez trouver ci-dessous la liste des dépendances 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>

Mais ça ne marche pas.

Par exception, je ne suis pas en mesure de comprendre ce qui manque. Je ne suis pas en mesure de trouver des références pour ce problème sur SO ou tout autre forum. Veuillez me le faire savoir, si vous avez vu ce problème plus tôt et vous savez comment le résoudre. Merci.


Mise à jour du 11 juin 2014:

Après avoir référé ce blog et en excluant certains modules resteasy et jackson, j'ai essayé de créer un jboss-deployment-structure.xml similaire et de le conserver dans le dossier META-INF de mon projet EJB. Cela a résolu mon problème de NoSuchMethodError pour "org.jboss.resteasy.spi.ResteasyProviderFactory. (Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)". La structure de mon jboss-deployment-structure.xml est la suivante:

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

Mais maintenant, je vois une exception similaire pour une autre méthode:

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

Et je vois cette exception à la ligne:

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

Une chose étrange est que, lorsque j'inspecte "response.readEntity (String.class)", pendant le débogage, je peux voir la valeur String. Mais lorsque j'essaie de passer à l'étape suivante, je vois cette erreur. Pouvez-vous me guider, quel pourrait être le problème?

Mise à jour supplémentaire:

J'y ai fait référence JBOSS Issue tracker . Mais il était lié à WildFly et non au serveur EAP. Il nous demande d'exclure le module "javaee-api". J'ai essayé d'exclure le module "javaee-api", mais cela ne fonctionne pas non plus.

15
user613114

Enfin, après m'être cogné la tête pendant quelques jours, j'ai pu résoudre ces problèmes.


Solution pour le problème 1:

Erreur: "Java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory. (Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)" "

Solution: J'ai résolu ce problème, en ajoutant plus de modules de resteasy dans la liste d'exclusion à l'intérieur de jboss-deployment-structure.xml. Mon état actuel de jboss-deployment-structure.xml est le suivant:

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

Je pense que cela aurait pu fonctionner en excluant simplement les modules "org.jboss.resteasy.resteasy-jaxrs" et "org.jboss.resteasy.resteasy-cdi". Mais je n'ai pas essayé plus loin car j'étais confronté à un autre problème. Vous pouvez essayer en supprimant les exclusions inutiles.

Solution pour le problème 2:

Erreur: "Causée par: Java.lang.NoSuchMethodError: javax.ws.rs.core.Response.readEntity (Ljava/lang/Class;) Ljava/lang/Object;"

Solution: JBOSS EAP 6.1, est fourni avec la distribution de resteasy par défaut. J'ai téléchargé la dernière implémentation de resteasy jax-rs (resteasy-jaxrs-3.0.7.Final-all.Zip) à partir de location .

Il est livré avec un fichier Zip appelé resteasy-jboss-modules-3.0.7.Final.Zip. Décompressez ce fichier dans le répertoire modules/system/couches/base/de la distribution JBoss EAP 6.1. Cela écrasera certains des fichiers existants. Cela résoudra le deuxième problème.

J'espère que cette information pourrait aider les autres.

8
user613114

Ces problèmes sont dus à une version différente de l'implémentation de Resteasy Client entre votre application et les modules Jboss EAP. Vous utilisez la dernière version de jaxrs-client, mais JBoss EAP 6.3.0 utilise une version très ancienne (resteasy-jaxrs-2.3.8.Final-redhat-3).

Téléchargez simplement le dernier pack d'implémentation de JBoss Resteasy (quelque chose comme ceci: resteasy-jboss-modules-3.0.9.Final.Zip) et décompressez dans le dossier EAP Modules en remplaçant les fichiers existants modules.xml et en ajoutant de nouveaux pots. Remeber remplace tous les JARS du Zip (pas seulement les resteasy-jaxrs).

9
Wojciech Szymski