Исключение в 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>
Любая идея?
Ответы
Ответ 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>