在REST泽西例外
我尝试启动应用程序,但使用Tomcat 7
,我有这样的exception。
我认为这可以是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>
任何想法 ?
你同时使用Jersey 1 & 2
(Jersey 1是显式依赖,Jersey 2是jersey-test-framework-provider-jdk-http
的传递依赖),这是不可能的 – 所以classloader
正在拾取错误的URIBuilder
类。
com.sun.jersey
group
的Jersey
依赖项都是Jersey version 1
。 Jersey version 2
使用组org.glassfish.jersey
。
您在导致此问题的Maven
依赖关系中都有。
如果可能只使用Jersey 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
构件包含javax.ws.rs命名空间的一个版本(1.0),因此它是唯一可能需要的。 rs-api在同一个命名空间中也包含JAX-RS(2.0)的一个版本,所以当你把这两个版本放在一起,但是它们是不同的版本时,它可能会导致你看到的冲突。
这可能是由于提供了JAX-RS 1.0和JAX-RS 2.0的“任何”冲突造成的。 JAX-RS 1.0通常由com.sun.jersey:jersey*
artifacts(特别是jersey-core)提供,JAX-RS 2.0由org.glassfish.jersey.core:jersey*
artifacts提供,或者javax.ws.rs:javax.ws.rs-api
工件,或者可能是javax:javaee-api
工件,或者jsr311-api-1.0
工件。
问题在于,由于它们是不同的组+工件名称,默认情况下,maven将不知不觉地在您的最终发行版中包含1.0和2.0版本的jar文件。
问题进一步复杂化的原因是,由于类path中有多个冲突的jar,所以“有时”可能起作用,然后“有时”可能不起作用(因此一些报告称“它与tomcat7协同工作,但是与tomcat8协同工作”等)
更复杂的问题是,如果你甚至有单一的依赖关系,依赖于上述任何一个,那么maven将带来这两个版本,你被打败。 你可以从mvn dependency:tree
find来自哪里
所以你必须去“全部1.0”或“全部2.0”。 在我们的例子中,我们通过添加一些传递依赖项排除到我们的pom中去。 如果你想全部2.0看到这里 。
我解决了这个问题:我删除了库JAX-RS 2.0,添加了库jersey-server-1.8.jar,jersey-core-1.8.jar,jersey-servlet-1.12.jar和asm-3.3.1.jar
在我的情况下,jsr311-api-0.10.jar和javax.ws.rs-api-2.0.jar都在应用程序库中。 我删除了jsr311 jar,问题解决了
我有确切的问题找不到问题。 在第一次Tomcat升起,一切正常,但重新启动服务器后,我有例外。
解决的办法是降级tomcat到7.0.26它做了诡计不知道为什么。
我没有意识到,但服务器上的WEB-INF / lib文件夹中已经有一个名为javax.ws-rs-api-2.0.jar的文件。 这是两年前由其他人添加的。 这是与我复制到WEB-INF / lib文件夹中的jersey文件组发生冲突。 我备份/重命名文件,重新启动我的容器(即Tomcat)的服务,它的工作。
我们需要做出以下更改:
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>