在JAX-RS上使用UriBuilder的AbstractMethodError

我正在尝试使用异步响应构建REST Web服务。

我在网上查看了这个错误,但是,没有一个解决方案对我有用。 我不确定如何去做。

这是REST服务的代码,它有AsyncResponse和@Suspended ,它们取自pom.xml指定的jar文件,我将在下面提供。 问题是,在部署战争时,我得到一个例外:

 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 

我的class级如下:

 package com.crudapp; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import javax.annotation.Generated; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; //import javax.ws.rs.core.UriBuilder; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.google.gson.Gson; import com.mysql.jdbc.StringUtils; import dao.User; import dao.UserDAO; import dao.UserDAOImpl; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; @Path("/crudpath") public class EntityResource { private final ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/spring.xml"); UserDAO userdao = null; private final int numOfThreads = 10; private final ExecutorService executorService = Executors.newFixedThreadPool(numOfThreads); // userdao.getUsers("118"); //ctx.close(); @GET @Produces("application/json") public Response getTupleFromDBasJSON(@QueryParam("param1") String userid, @Suspended final AsyncResponse asyncresponse ){ if(StringUtils.isNullOrEmpty(userid)) throw new ServiceException("Userid passed to the REST service /crudpath is null or empty"); userdao = (userdao==null)? ctx.getBean("userDAO", UserDAOImpl.class) : userdao; Gson gson = new Gson(); Future<List> futures = executorService.submit(new DAOTaskHandlerThread(userid)); List  users = new ArrayList(); if(futures.isDone()) { try{ users = futures.get(); if(users!= null) return Response.status(200).entity( gson.toJson(users).toString()).build(); } catch(Exception ex) { throw new ServiceException(ex); } } return Response.status(200).entity(new ArrayList().toString()).build(); /*// crrate a new thread.. call the DAO .. returns the result from here. JSONObject jsonObject = new JSONObject(); jsonObject.put("key", "value"); return Response.status(200).entity( jsonObject.toString()).build();*/ } private class DAOTaskHandlerThread implements Callable<List>{ //private UserDAO userDAO; private String userid; private DAOTaskHandlerThread(//UserDAO userDAO, String useridpassed){ ///this.userDAO= userDAO; userid= useridpassed; } @Override public List call() throws Exception { // TODO Auto-generated method stub return userdao.getUsers(userid); } } } 

我的maven的pom.xml文件如下:

  4.0.0 RESTJerseyExample RESTJerseyExample 0.0.1-SNAPSHOT war  src   maven-war-plugin 2.4  WebContent false    maven-compiler-plugin 3.1  1.8 1.8       1.7 4.0.3.RELEASE    org.springframework spring-context ${org.springframework-version}   org.springframework spring-webmvc ${org.springframework-version}   org.springframework spring-orm ${org.springframework-version} jar compile    asm asm 3.3.1   com.sun.jersey jersey-bundle 1.19   org.json json 20140107   com.sun.jersey jersey-server 1.19   com.sun.jersey jersey-core 1.19   org.apache.commons commons-dbcp2 2.0    commons-io commons-io 2.4   org.apache.httpcomponents httpclient 4.3.2    javax.ws.rs javax.ws.rs-api 2.0-m12    

当应用程序尝试调用抽象方法时,抛出 AbstractMethodError

uriUriBuilder的抽象方法,因此您需要实现此方法。 此方法(使用String参数)来自JAX-RS规范的2.0版。

您正在尝试将JAX-RS 2.0与Jersey 1. *一起使用。 相反,您需要使用实现JAX-RS 2.0的Jersey 2. *并包含uri方法的实现。

在您的pom.xml您可以删除这些依赖项:

  com.sun.jersey jersey-bundle 1.19   com.sun.jersey jersey-server 1.19   com.sun.jersey jersey-core 1.19   javax.ws.rs javax.ws.rs-api 2.0-m12  

并使用这些依赖项:

  org.glassfish.jersey.core jersey-server 2.17   org.glassfish.jersey.containers jersey-container-servlet-core 2.17  

使用这个, uri方法在jersey-common JerseyUriBuilder类中实现。

编辑

您需要在web.xml org.glassfish.jersey.servlet.ServletContainer servlet com.sun.jersey.spi.container.servlet.ServletContainer更改为com.sun.jersey.spi.container.servlet.ServletContainer中的org.glassfish.jersey.servlet.ServletContainerinit-param com.sun.jersey.config.property.packagesjersey.config.server.provider.packages

我想在这篇文章中添加一个答案。 我今天遇到了类似的问题,发现根本原因是另一个依赖的jar,它是在内部使用较旧版本的Jersey / JAX-RS

修复之前我的POM是:

 2.17 ...  org.glassfish.jersey.core jersey-server ${jersey.version}   org.glassfish.jersey.containers jersey-container-servlet-core ${jersey.version}   com.ci.wrapper client-wrapper ${clients-wrapper.version}   org.slf4j slf4j-api     com.api.commons transferobjects 3.0.2  

问题在于“com.ci.wrapper”和“com.api.commons”。 他们包括两个不同的JAR的BraveJersey和org.apache.cxf.cxf-rt-frontend-jaxrs(2.5.1),它们使用Jersey和JAX-RS 1.X版本。

在排除嵌套jar并添加较新版本的BraveJersey2 / org.apache.cxf.cxf-rt-frontend-jaxrs(3.1.5)后,它得到了解决。

  com.api.commons transferobjects 3.0.2   cxf-rt-frontend-jaxrs org.apache.cxf     org.apache.cxf cxf-rt-frontend-jaxrs 3.1.5   com.ci.wrapper client-wrapper ${clients-wrapper.version}   org.slf4j slf4j-api   brave-jersey com.github.kristofa     com.github.kristofa brave-jersey2 2.4.2  

如果您遇到类似的问题,请检查包含的项目或jar是否可能使用不兼容的Jersey / Jax-RS版本。

当我在我的一个项目中尝试使用库(自定义构建)时,我遇到了这个问题。 所以问题是由于com.sun.jersey依赖项不匹配而发生的。 我的项目是使用泽西版本2.15,而自定义库给我com.sun.jersey传递版本1.17。

那么如何找到这样的问题呢。

使用gradle dependencies任务来查找依赖项(它提供嵌套级别结果,这意味着还将显示所有传递依赖项)

一旦确定导致依赖性的问题。 在项目中添加所需的依赖项时排除它们。

例如,httpRestClient是我想在我的项目中使用的自定义库的名称。 所以这是我如何添加依赖项,同时排除组'com.sun.jersey'的冲突依赖项

 compile(httpRestClient) { exclude group: 'com.sun.jersey' } 

这样您就可以使用任何库并排除冲突的库。

谢谢。

在我的情况下,需要删除cxf-rt-frontend-jaxrshttpclint jar的组合来解决问题。 这两个jar都有类javax.ws.rs.core.UriBuilder,这个类的多个版本引起了这个问题。

在移除它之后,我的pom对这两个jar子都具有传递依赖性。

 enter code here  org.apache.cxf cxf-rt-frontend-jaxrs   org.apache.httpcomponents httpclient  

在我们的案例中,罪魁祸首是这种依赖

  org.apache.wink wink-common 1.0-incubating