web-dev-qa-db-fra.com

Exception dans REST Jersey

J'essaie de démarrer l'application mais avec Tomcat 7 et j'ai une exception comme celle-ci.

Je pense que cela peut être quelque chose avec Maven dependency, mais je suis sûr. Si certains savent ce qui se passe s'il vous plaît pour réponse :)

Exception:

message Servlet execution threw an exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet execution threw an exception
    org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)

root cause

Java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
    javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.Java:119)
    com.Sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.Java:651)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
    org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.50 logs.

Maven POM:

<properties>
        <application.version>1.0</application.version>
        <spring.version>4.0.0.RELEASE</spring.version>
        <spring.security.version>3.2.0.RELEASE</spring.security.version>
        <jersey.version>1.18.1</jersey.version>
    </properties>



    <dependencies>
        <dependency>
            <groupId>climbing-portal-facade</groupId>
            <artifactId>climbing-portal-facade</artifactId>
            <version>${application.version}</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
            <artifactId>jersey-test-framework-provider-jdk-http</artifactId>
            <version>2.7</version>
        </dependency>

        <!-- Jersey + Spring -->
        <dependency>
            <groupId>com.Sun.jersey.contribs</groupId>
            <artifactId>jersey-spring</artifactId>
            <version>${jersey.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-beans</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aop</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

Une idée ?

30
user3570228

Vous utilisez les deux Jersey 1 & 2 (Jersey 1 est une dépendance explicite, Jersey 2 est une dépendance transitive de jersey-test-framework-provider-jdk-http) et ce n'est pas possible - la classloader récupère la mauvaise classe URIBuilder

Les dépendances Jersey dans groupcom.Sun.jersey sont toutes Jersey version 1. Jersey version 2 utilise le groupe org.glassfish.jersey

Vous avez les deux dans vos dépendances Maven qui sont à l'origine de ce problème. 

Si possible, utilisez uniquement Jersey 2

42
Will

Cela peut aussi être causé en incluant les deux

<dependency>
  <groupId>com.Sun.jersey</groupId>
  <artifactId>jersey-server</artifactId>
  <version>1.xxx</version>
</dependency>

Et

<dependency>
  <groupId>javax.ws.rs</groupId>
  <artifactId>javax.ws.rs-api</artifactId>
  <version>2.xx</version>
</dependency>

Les artefacts com.Sun.jersey incluent une version (1.0) de l’espace de noms javax.ws.rs; il est donc probablement le seul nécessaire. rs-api inclut également une version de JAX-RS (2.0) dans le même espace de noms. Ainsi, lorsque vous associez les deux versions, mais que leur version est différente, cela peut entraîner un conflit.

Cela peut être causé par "tout" conflit qui fournit à la fois JAX-RS 1.0 et JAX-RS 2.0. JAX-RS 1.0 est souvent fourni par les artefacts com.Sun.jersey:jersey* (en particulier jersey-core), et JAX-RS 2.0 par l'un des artefacts org.glassfish.jersey.core:jersey*, ou l'artefact javax.ws.rs:javax.ws.rs-api, ou éventuellement l'artefact javax:javaee-api, ou par l'artefact jsr311-api-1.0.

Le problème est qu’étant donné que ce sont des noms de groupe + artefacts différents, maven par défaut inclura inconsciemment _ _ les deux versions 1.0 et 2.0 dans la distribution finale.

Le problème est d'autant plus compliqué que, puisqu'il y a plusieurs fichiers jar en conflit dans le chemin d'accès aux classes, "parfois", cela pourrait fonctionner, puis "parfois", mais parfois (cela signifierait que "cela fonctionnait avec Tomcat7, mais échouait avec Tomcat8", etc.).

Ce qui complique encore le problème, c’est que si vous avez une seule dépendance qui dépend de l’un des éléments ci-dessus de manière transitoire, alors Maven vous fournira les deux versions et vous serez fatigué. Vous pouvez trouver ce qui vient d'où avec mvn dependency:tree

Donc, vous devez soit aller à "tous les 1.0" ou "tous les 2.0." Dans notre cas, nous avons utilisé la version 1.0 en ajoutant des exclusions de dépendance transitive à notre pom. Si vous voulez aller tous les 2.0 voir ici .

22
Sloloem

Je résous ce problème: je supprime la bibliothèque JAX-RS 2.0, j'ajoute les bibliothèques jersey-server-1.8.jar, jersey-core-1.8.jar, jersey-servlet-1.12.jar et asm-3.3.1.jar

3
pedrosakki

Dans mon cas, jsr311-api-0.10.jar et javax.ws.rs-api-2.0.jar se trouvaient dans l'application lib. J'ai supprimé le bocal jsr311 et le problème a été résolu

2
Alessandra

J'ai eu le problème exact ne pouvais pas trouver le problème . La première fois le Tomcat est monté et tout a fonctionné mais après le redémarrage du serveur J'ai eu l'exception.

La solution consistait à rétrograder Tomcat à la version 7.0.26. Le problème n’était pas sûr de savoir pourquoi.

1
Nir Sivan

Je ne m'en rendais pas compte, mais il y avait un fichier nommé javax.ws-rs-api-2.0.jar déjà dans le dossier WEB-INF/lib du serveur. Il a été ajouté il y a deux ans par quelqu'un d'autre. Cela provoquait un conflit avec l'ensemble des fichiers jersey que j'ai copiés dans le dossier WEB-INF/lib . J'ai sauvegardé/renommé le fichier, redémarré le service de mon conteneur (Tomcat) et tout a fonctionné.

1
user3621633

Nous devons apporter les modifications ci-dessous:

web.xml

    <servlet>
      <servlet-name>RESTful Jersey Web Service Sample</servlet-name>
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>      
         <init-param>
                   <param-name>jersey.config.server.provider.packages</param-name>
                   <param-value>com.subu.jersey.rest</param-value>
         </init-param>
    </servlet>

pom.xml

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.17</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.17</version>
    </dependency>
0
Subhasish Sahu