Java RestFull WebService: JAX-RS implementation with Jersey 2.3.1 libraries

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

JBWEB000289: Servlet COM.soleil.Jersey.échantillon.helloworld.ressources.MyApplication jeté charge() exception: java.lang.NoSuchMethodError: javax.ws.rs.noyau.Application.getProperties () Ljava/util/Map;

Dans le POM-je mettre 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>

C'est ma toile.xml avec restEasy la désactivation des tags:

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

24
demandé sur Joshua Taylor 2013-10-07 17:01:05

5 réponses

NoSuchMethodError signifie habituellement que vous avez deux versions différentes de la classe sur votre chemin de classe. Comme le javax.ws.rs.core.Application la classe A le getProperties() méthode dans sa version JAX-RS 2, mais pas dans JAX-RS 1.x, je suppose que d'une façon ou d'une autre vous combinez le Vieux 1.X Jersey (ou ancienne api REST) avec l'actuelle (2.3.1) one.

aussi le paquet dans lequel vous travaillez (com.sun.jersey - le "vieux" paquet Jersey) pointe un peu vers cette direction (bien que juste placer votre code dans ce paquet en soi ne peut pas causer le problème mentionné), vous avez évidemment commencé avec le Jersey 1.x exemple comme base (il y a aussi des samples à Jersey 2, voir helloworld-webapp sur Jersey GitHub).

Est-il possible, que restEasy (certainement en contenant javax.ws.rs.core.Application class) n'est pas complètement éteint et d'une façon ou d'une autre par défaut à JAX-RS 1.version x?

je commencerais par inspecter votre fichier pom, regarder le pom efficace (si votre descripteur de projet a certains parents) et de vérifier soigneusement ce qui est sur votre chemin de classe - je crois qu'il ya un 1.version x de javax.ws.rs-api quelque part. Essayez aussi 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 aurez très probablement à ajouter jersey-common (2.3.1) la dépendance, comme déjà lors de l'initialisation, le ResourceConfig.packages() la méthode appelle le PackageScanner constructeur, qui contient appel à ReflectionHelper - et ce n'est pas une partie du serveur jar.

J'espère que cela vous aidera.

48
répondu AdamL 2013-10-09 08:44:54

j'ai fait face au même problème récemment. Je pensais partager mes pas pour toi. Comme l'indiquent les autres réponses, le problème est principalement dû au fait que vous avez deux versions différentes de la même classe sur votre chemin de classe. Ainsi, lorsque vous ajoutez des dépendances maven dans votre pom être prudent.

ce genre de problèmes sont normalement appelés Pot De L'Enfer. Vous pouvez utiliser jhades API pour investigate les classes se chevauchent. Voici les étapes simples que j'ai suivre.

ajouter la dépendance jhades dans votre pom.

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

Afficher le rapport

Appel new JHades().overlappingJarsReport(); dans votre main méthode, il sera de sortie sur la sortie standard stdout.

Sortie De L'Échantillon:

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!

supprimer une des dépendances de chevauchement maven dans votre pom.

vous pouvez aussi utiliser une autre approche comme celle de maven exclusions de personnes à charge.

Source: Blog sur jhades

Espérons que cela va aider quelqu'un :)

19
répondu gihan 2015-11-18 18:43:25

je viens de faire ce travail sur JBoss EAP 6.1.1-Jersey 2.3.1.

Les choses habituelles ne fonctionnent pas/ne sont pas suffisamment sur leur propre:

  • désactiver le sous-système jaxrs-en mode autonome.xml/domaine.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 le 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 ceci désactivera l'implémentation jax-rs de JBoss (RestEasy) pour toutes les autres applications ainsi que la désactivation du sous-système jaxrs dans standalone/domain.XML.)

12
répondu Jan Snelders 2013-10-16 13:30:10

C'est un Maillot de conflit de version problème. J'ai eu le même problème. Voici comment il est résolu:

  1. voir les dépendances de votre paquet "mvn dependency: tree"

  2. S'il y a une dépendance de bibliothèque qui dépend d'une ancienne version de Jersey, vous pouvez ajouter une section exclusions dans l'étiquette de dépendance pour cette bibliothèque dans pom.xml

4
répondu Hajar Homayouni 2017-03-24 20:41:22

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 Supprimer cette dépendance a résolu mon problème.

0
répondu David Loy 2017-09-27 20:24:39