java.lang.AbstractMethodError:javax.ws.rs.core.UriBuilder.uri

时间:2014-04-24 18:53:19

标签: jersey jax-rs abstractmethoderror

我尝试启动应用程序但使用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>

有什么想法吗?

8 个答案:

答案 0 :(得分:42)

你同时使用Jersey 1 & 2(泽西岛1是一个明确的依赖,泽西岛2是jersey-test-framework-provider-jdk-http的传递依赖),这是不可能的 - 所以classloader正在接受错误的URIBuilder课程。

Jersey group中的com.sun.jersey个依赖关系都是Jersey version 1Jersey version 2使用群组org.glassfish.jersey

您的Maven依赖项中都存在导致此问题的两者。

如果可能,只使用Jersey 2

答案 1 :(得分:22)

这也可以包括两者

<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*工件(特别是jersey-core)提供,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.0和2.0版本的jar包括在您的最终发行版中。

问题的进一步复杂化是因为类路径中存在多个冲突的jar,“有时”它可能会起作用,然后“有时”它可能不起作用(因此有些报告称“它与tomcat7配合使用,但与tomcat8失败”等)

问题的进一步复杂化是,如果你有一个依赖于上述任何一个的单一依赖,那么maven将引入两个版本而你就被软化了。您可以通过mvn dependency:tree

找到来自哪里的内容

所以你必须要去“全部1.0”或“全部2.0”。在我们的例子中,我们通过向我们的pom添加一些传递依赖性排除来使用所有1.0。如果您想要全部使用2.0,请参阅here

答案 2 :(得分: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

答案 3 :(得分:2)

在我的例子中,jsr311-api-0.10.jar和javax.ws.rs-api-2.0.jar都在应用程序库中。我删除了jsr311 jar并且问题解决了

答案 4 :(得分:1)

我有确切的问题无法找到问题。 在第一次Tomcat上升并且一切正常但重启服务器之后 我有例外。

解决方案是将tomcat降级到7.0.26。虽然这样做但不确定原因。

答案 5 :(得分:1)

我没有意识到,但是 WEB-INF / lib 文件夹中已有一个名为 javax.ws-rs-api-2.0.jar 的文件在服务器上。它是两年前由其他人添加的。它导致与我复制到 WEB-INF / lib 文件夹的泽西文件集冲突。我备份/重命名了该文件,重新启动了我的容器(即Tomcat)的服务,并且它运行良好。

答案 6 :(得分:0)

我们需要进行以下更改:

的web.xml

$cursor = $collection->find();
$firstDocument = $cursor->toArray()[0];

的pom.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>

答案 7 :(得分:0)

在我的情况下,jsr311-api-0.10.jar和javax.ws.rs-api-2.1.jar都在应用程序库中。我删除了javax.ws.rs-api-2.1.jar并解决了问题