创建我自己的REST API会引发servlet执行异常

时间:2016-10-14 10:16:36

标签: java rest tomcat exception servlets

我一直致力于使用jersey和java构建自己的REST API。今天它停止了工作,虽然一位朋友也在努力推动他的改变。他没有在依赖方面做任何改变,但他确实添加了一个我们的主要API类创建的控制器。现在每当我尝试访问资源时,tomcat服务器都会抛出错误:

    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:669)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.ja

我们相信它在添加jsoup依赖后开始了。

编辑: 我编辑了我的依赖项和web.xml,现在我只找到了404.

这是我的pom.xml

中的依赖项
<dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>2.23.2</version>
        </dependency>       
        <dependency>
           <groupId>org.glassfish.jersey.containers</groupId>
           <artifactId>jersey-container-servlet-core</artifactId>
           <version>2.23.2</version>
           <scope>provided</scope>
        </dependency>
        <dependency>
             <groupId>org.codehaus.jettison</groupId>
             <artifactId>jettison</artifactId>
             <version>1.3.8</version>
        </dependency>
        <dependency>
        <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.twitter4j</groupId>
            <artifactId>twitter4j-core</artifactId>
            <version>[4.0,)</version>
        </dependency>
        <dependency>
            <groupId>org.facebook4j</groupId>
            <artifactId>facebook4j-core</artifactId>
            <version>[2.4,)</version>
        </dependency>
    </dependencies>

这是我的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>api</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>



    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>

</web-app>

编辑 如果我尝试访问:https://stackoverflow.com/a/7857102/2377961

@Path("/v1")
public class API {
private Controller controller;

public API(){
    controller = new Controller();
}


/**
 * Prints to the screen if we are in /v1/foobar
 * 
 * @return
 */
@GET
@Path("/foobar")
@Produces(MediaType.TEXT_HTML)
public String print2() {
    return "Please specify what resource you need.";
}

我刚拿到404。

2 个答案:

答案 0 :(得分:1)

可能是你的问题是由错误的 jersey-container-servlet 引起的,这可能会导致错误的uribuilder被选中

https://jersey.java.net/documentation/latest/modules-and-dependencies.html#server-jdk

jersey-container-servlet =&gt; Jersey核心Servlet 3.x实现

jersey-container-servlet-core =&gt; Jersey核心Servlet 2.x实现

变化:

<dependency>
           <groupId>org.glassfish.jersey.containers</groupId>
           <artifactId>jersey-container-servlet-core</artifactId>
           <version>2.23.2</version>
           <scope>provided</scope>
        </dependency>

<dependency>
           <groupId>org.glassfish.jersey.containers</groupId>
           <artifactId>jersey-container-servlet</artifactId>
           <version>2.23.2</version>
           <scope>provided</scope>
        </dependency>

另请参阅https://jersey.java.net/documentation/latest/modules-and-dependencies.html#dependencies以了解您需要为Glassfish和其他基于Servlet的(非jax-rs集成)容器提供哪些依赖项

答案 1 :(得分:0)

1)当应用程序尝试调用抽象方法时,会抛出AbstractMethodError异常。
uriUriBuilder中的抽象方法,因此您需要实现此方法。

你应该使用JAX-RS 2.0和Jersey 2. *来实现JAX-RS 2.0并包含uri方法的实现。

2)通过查看您的堆栈跟踪,它清楚地表明您正在使用Jersey版本1&amp; 2,这是不可能的,所以类加载器正在选择错误的URIBuilder类。

堆栈追踪:

com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:669)

com.sun.jersey中的Jersey依赖项均为Jersey版本1. Jersey版本2使用组org.glassfish.jersey