wake-up-neo.net

Ausnahme in REST Jersey

Ich versuche die Anwendung zu starten, aber Tomcat 7 zu verwenden, und ich habe eine Ausnahme wie diese.

Ich denke, das kann etwas mit Maven dependency sein, aber ich bin mir sicher. Wenn einige wissen, was los ist, bitte zur Antwort :)

Ausnahme:

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>

Irgendeine Idee ?

30
user3570228

Sie verwenden beide Jersey 1 & 2 (Jersey 1 ist eine explizite Abhängigkeit, Jersey 2 ist eine transitive Abhängigkeit von jersey-test-framework-provider-jdk-http) und das ist nicht möglich - also nimmt classloader die falsche URIBuilder-Klasse an. 

Die Jersey Abhängigkeiten in groupcom.Sun.jersey sind alle Jersey version 1. Jersey version 2 verwendet die Gruppe org.glassfish.jersey

Sie haben beide Abhängigkeiten in Maven, die dieses Problem verursachen. 

Verwenden Sie möglichst nur Jersey 2

42
Will

Dies kann auch durch das Einschließen von beidem verursacht werden

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

Und

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

com.Sun.jersey-Artefakte enthalten eine Version (1.0) des Namespaces javax.ws.rs, sodass es wahrscheinlich die einzige ist, die wahrscheinlich benötigt wird. rs-api enthält auch eine Version von JAX-RS (2.0) im selben Namespace. Wenn Sie also die beiden zusammen haben, aber es sich um unterschiedliche Versionen handelt, kann dies zu einem Konflikt führen, den Sie sehen.

Dies kann durch einen "beliebigen" Konflikt verursacht werden, der sowohl JAX-RS 1.0 als auch JAX-RS 2.0 bietet. JAX-RS 1.0 wird häufig von den com.Sun.jersey:jersey*-Artefakten (insbesondere Jersey-Core) bereitgestellt, und JAX-RS 2.0 wird von einem der org.glassfish.jersey.core:jersey*-Artefakte oder dem javax.ws.rs:javax.ws.rs-api-Artefakt oder möglicherweise dem javax:javaee-api-Artefakt oder dem jsr311-api-1.0-Artefakt bereitgestellt.

Das Problem ist, dass Maven, da es sich um unterschiedliche Gruppen- und Artefaktnamen handelt, standardmäßig unwissentlich sowohl die 1.0- als auch die 2.0-Version in Ihre endgültige Distribution aufnehmen.

Das Problem wird weiter verkompliziert, da der Klassenpfad mehrere in Konflikt stehende Gläser enthält, "manchmal" es funktioniert, und "manchmal" kann es nicht sein (daher haben einige Berichte "mit Tomcat7 gearbeitet, aber mit Tomcat8 fehlgeschlagen" usw.)

Das Problem wird weiter verkompliziert: Wenn Sie nur eine einzige Abhängigkeit haben, die transitiv von einem der oben genannten Faktoren abhängt, bringt maven beide Versionen ein, und Sie werden abgespritzt. Mit mvn dependency:tree können Sie herausfinden, was von woher kommt.

Sie müssen also entweder auf "alle 1.0" oder "alle 2.0" gehen. In unserem Fall haben wir alle 1.0 mitgenommen, indem wir einige Beschränkungen für die Abhängigkeit von Abhängigkeiten zu unserem Pom hinzugefügt haben. Wenn Sie alle 2.0 gehen wollen, sehen Sie hier .

22
Sloloem

Ich löse dieses Problem: Ich lösche die Bibliothek JAX-RS 2.0, füge die Bibliotheken Jersey-Server-1.8.jar, Jersey-Kern-1.8.jar, Jersey-Servlet-1.12.jar und ASM-3.3.1.jar hinzu

3
pedrosakki

In meinem Fall befanden sich sowohl jsr311-api-0.10.jar als auch javax.ws.rs-api-2.0.jar in der Anwendung lib. Ich habe jsr311 jar gelöscht und das Problem wurde behoben

2
Alessandra

Ich hatte das genaue Problem nicht gefunden. Das erste Mal war der Tomcat hochgefahren und alles hat funktioniert, aber nach einem Neustart des Servers hatte ich die Ausnahme.

Die Lösung bestand darin, Tomcat auf 7.0.26 herabzustufen. Der Trick war jedoch nicht sicher, warum.

1
Nir Sivan

Ich wusste es nicht, aber es gab bereits eine Datei namens javax.ws-rs-api-2.0.jar im Ordner WEB-INF/lib auf dem Server. Es wurde vor zwei Jahren von jemand anderem hinzugefügt. Dies verursachte einen Konflikt mit den Jersey-Dateien, die ich in den Ordner WEB-INF/lib kopiert hatte. Ich habe die Datei gesichert/umbenannt, den Dienst für meinen Container (d. H. Tomcat) neu gestartet, und es hat funktioniert.

1
user3621633

Wir müssen die folgenden Änderungen vornehmen:

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