Подтвердить что ты не робот

Исключение в REST Jersey

Я пытаюсь запустить приложение, но используя Tomcat 7, и у меня есть такое исключение.

Я думаю, что это может быть что-то с Maven dependency, но я уверен. Если кто-то знает, что происходит, пожалуйста, ответьте:)

Исключение:

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>

Любая идея?

4b9b3361

Ответ 1

Вы используете оба Jersey 1 & 2 (Джерси 1 - это явная зависимость, Джерси 2 - транзитивная зависимость jersey-test-framework-provider-jdk-http), и это невозможно - поэтому classloader подбирает неправильный класс URIBuilder.

Зависимости Jersey в group com.sun.jersey - все Jersey version 1. Jersey version 2 используется группа org.glassfish.jersey.

У вас есть как в зависимостях Maven, вызывающих эту проблему.

Если возможно, используйте только Jersey 2.

Ответ 2

Это также может быть вызвано включением как

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

И

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

com.sun.jersey Артефакты включают в себя версию (1.0) пространства имен javax.ws.rs, поэтому это единственное, что, вероятно, необходимо. rs-api также включает в себя версию JAX-RS (2.0) в том же пространстве имен, поэтому, когда у вас есть эти два вместе, но они разные версии, это может вызвать конфликт, который вы видите.

Это может быть вызвано наличием "любого" конфликта, который обеспечивает как JAX-RS 1.0, так и JAX-RS 2.0. JAX-RS 1.0 часто предоставляется артефактами com.sun.jersey:jersey* (в частности, джерси-сердечник), а JAX-RS 2.0 обеспечивается любым артефактом org.glassfish.jersey.core:jersey* или артефактом javax.ws.rs:javax.ws.rs-api или, возможно, артефактом javax:javaee-api, или артефакт jsr311-api-1.0.

Проблема заключается в том, что, поскольку они являются разными именами групп + артефактов, maven по умолчанию будет неосознанно включать в версию 1 и 2.0 версии в ваш последний дистрибутив.

Дальнейшее усложнение проблемы состоит в том, что, поскольку в пути к классам имеется несколько конфликтующих баночек, "иногда" это может сработать, а затем "иногда" это может быть не так (следовательно, некоторые сообщения "он работал с tomcat7, но не с tomcat8" и др.)

Дальнейшее усложнение проблемы заключается в том, что если у вас есть хотя бы одна зависимость, которая транзитивно зависит от любого из вышеперечисленных, то maven будет приводить обе версии и вы будете закрыты. Вы можете найти, что происходит, когда с помощью mvn dependency:tree

Итак, вам нужно либо перейти на "все 1.0", либо "all 2.0". В нашем случае мы пошли со всеми 1.0, добавив некоторые транзитивные исключения зависимостей в наш pom. Если вы хотите пройти весь 2.0, см. здесь.

Ответ 3

Я решаю эту проблему: я удаляю библиотеку JAX-RS 2.0, добавляю библиотеки jersey-server-1.8.jar, jersey-core-1.8.jar, jersey-servlet-1.12.jar и asm-3.3.1.jar

Ответ 4

В моем случае оба jsr311-api-0.10.jar и javax.ws.rs-api-2.0.jar были в приложении lib. Я удалил jsr311 jar и проблема была решена.

Ответ 5

У меня была точная проблема, которая не могла найти проблему. В первый раз Tomcat поднялся, и все сработало, но после перезапуска сервера У меня было исключение.

Решение заключалось в том, чтобы понизить tomcat до 7.0.26. Однако этот трюк не знал, почему.

Ответ 6

Я этого не осознавал, но в папке WEB-INF/lib на сервере был файл с именем javax.ws-rs-api-2.0.jar. Он был добавлен еще два года назад кем-то другим. Это вызвало конфликт с набором файлов jersey, которые я скопировал в папку WEB-INF/lib. Я скопировал/переименовал файл, перезапустил службу для своего контейнера (то есть Tomcat), и он сработал.

Ответ 7

Нам нужно сделать следующие изменения:

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>