web-dev-qa-db-fra.com

Java Service Web RestFul: implémentation JAX-RS avec les bibliothèques Jersey 2.3.1

J'essaie d'exécuter une application simple "Hallo World" Jersey 2.3.1 REST sur JBoss jboss-eap-6.1 AS. Dans web.xml, j'ai désactivé la bibliothèque restEasy. Pendant le déploiement, je suis obtenir l'erreur:

JBWEB000289: Servlet com.Sun.jersey.samples.helloworld.resources.MyApplication a lancé l'exception load (): Java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties () Ljava/util/Map;

Dans POM, je mets ces dépendances:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>

Voici mon web.xml avec les balises restEasy désactivant:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>com.Sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.Sun.jersey.samples.helloworld.resources.MyApplication</param-value>
        </init-param>
           <load-on-startup>1</load-on-startup>
    </servlet>
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.scan.providers</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.scan.resources</param-name>
        <param-value>false</param-value>
    </context-param>
    <servlet-mapping>
        <servlet-name>com.Sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Et ma configuration de ressources Java class:

package com.Sun.jersey.samples.helloworld.resources;
import org.glassfish.jersey.server.ResourceConfig;
public class MyApplication extends  ResourceConfig {   

     public MyApplication() {
            packages("com.Sun.jersey.samples.helloworld.resources");
          //super(HelloWorldResource.class);

     }
}

Quelqu'un a une idée pour le résoudre? merci d'avance, Roberto

25
Roberto

NoSuchMethodError signifie généralement que vous avez deux versions différentes de la classe sur votre chemin de classe. Comme la classe javax.ws.rs.core.Application A la méthode getProperties() dans sa version JAX-RS 2, mais pas dans JAX-RS 1.x, je suppose que vous combinez en quelque sorte l'ancien 1. x Jersey (ou ancien REST api) avec l'actuel (2.3.1)).

De plus, le package dans lequel vous travaillez (com.Sun.jersey - le 'vieux' package Jersey) pointe un peu dans cette direction (bien que le simple fait de placer votre code dans ce package ne puisse pas causer le problème mentionné), vous avez évidemment commencé avec le Exemple de Jersey 1.x comme base (il existe également des exemples dans Jersey 2, voir helloworld-webapp sur Jersey GitHub).

Est-il possible que restEasy (contenant également définitivement la classe javax.ws.rs.core.Application) Ne soit pas complètement désactivé et soit par défaut en version JAX-RS 1.x?

Je commencerais par inspecter votre fichier pom, regarder le pom efficace (si votre descripteur de projet a un parent) et vérifier soigneusement ce qui se trouve sur votre chemin de classe - je crois qu'il y a une version 1.x de javax.ws.rs-api Quelque part. Essayez également de nettoyer toutes les choses compilées et de reconstruire à partir de zéro.

En parlant de dépendances, si votre liste est exhaustive (concernant Jersey), vous devrez très probablement ajouter la dépendance jersey-common (2.3.1), comme déjà lors de l'initialisation, la méthode ResourceConfig.packages() appelle le constructeur PackageScanner, qui contient l'appel à ReflectionHelper - et cela ne fait plus partie du pot du serveur.

J'espère que cela t'aides.

47
AdamL

J'ai récemment rencontré le même problème. J'ai pensé partager mes pas pour toi. Comme l'indiquent les autres réponses, le problème est principalement dû au fait d'avoir deux versions différentes de la même classe sur votre chemin de classe. Donc, lorsque vous ajoutez des dépendances maven dans votre pom, soyez prudent.

Ces types de problèmes sont normalement appelés Jar Hell . Vous pouvez utiliser jhades API pour étudier les classes qui se chevauchent. Voici les étapes simples que j'ai suivies.

Ajoutez une dépendance jhades dans votre pom.

<dependency>
    <groupId>org.jhades</groupId>
    <artifactId>jhades</artifactId>
    <version>1.0.4</version>
</dependency>

Afficher le rapport

Appelez new JHades().overlappingJarsReport(); dans votre méthode main, elle sortira vers stdout.

Exemple de sortie:

file:/Users/justin/.m2/repository/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar overlaps with
file:/Users/justin/.m2/repository/javax/ws/rs/javax.ws.rs-api/2.0/javax.ws.rs-api-2.0.jar - total overlapping classes: 55 - same classloader ! This is an ERROR!

Supprimez l'une des dépendances Maven qui se chevauchent dans votre pom.

Vous pouvez également utiliser une autre approche comme celle de maven exclusions de dépendance .

Source: Article de blog sur jhades

J'espère que cela aidera quelqu'un :)

18
gihan

Je viens de le faire fonctionner sur JBoss EAP 6.1.1 - Jersey 2.3.1.

Les choses habituelles ne semblent pas fonctionner/ne suffisent pas à elles seules:

  • désactivation du sous-système jaxrs dans standalone.xml/domain.xml
  • ou, à l'exclusion des modules jax-rs dans jboss-deployment-structure.xml

De plus, vous devez désactiver complètement le chargement de l'API jax-rs 1.1 en modifiant module.xml dans jboss-eap-6.1/modules/system/layers/base/javax/ws/rs/api/main/module.xml comme ceci :

<module xmlns="urn:jboss:module:1.1" name="javax.ws.rs.api">
<resources>
    <!-- Disable the next line -->
    <!-- resource-root path="jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar"/ -->
    <!-- Insert resources here -->
</resources>

<dependencies>
    <module name="org.jboss.resteasy.resteasy-jaxrs" services="export"/>
</dependencies>
</module>

Veuillez noter que cela désactivera également l'implémentation jax-rs de JBoss (RestEasy) pour toutes les autres applications (tout comme la désactivation du sous-système jaxrs dans standalone/domain.xml).

13
Jan Snelders

Il s'agit d'un problème de conflit de version Jersey. J'ai eu le même problème. Voici comment cela est résolu:

  1. Voir les dépendances de votre package "mvn dependency: tree"

  2. S'il existe une dépendance de bibliothèque qui dépend d'une ancienne version de Jersey, vous pouvez ajouter une section d'exclusions dans la balise de dépendance de cette bibliothèque dans pom.xml

4
Hajar Homayouni

En utilisant la dépendance mvn: tree (merci pour la suggestion ci-dessus), j'ai pu identifier que le coupable (dans mon cas) était: javax.ws.rs:jsr311-api:1.1 La suppression de cette dépendance a résolu mon problème.

1
David Loy