我一直致力于使用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。
答案 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
异常。
uri
是UriBuilder
中的抽象方法,因此您需要实现此方法。
你应该使用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
。