Java 在JAX-RS上使用UriBuilder时出现AbstractMethodError
我正在尝试使用异步响应构建REST Web服务 我在网络上查看了这个错误,但是,没有一个解决方案对我有效。我不知道该怎么办 这是REST服务的代码,它有AsyncResponse和Java 在JAX-RS上使用UriBuilder时出现AbstractMethodError,java,maven,jersey,jax-rs,Java,Maven,Jersey,Jax Rs,我正在尝试使用异步响应构建REST Web服务 我在网络上查看了这个错误,但是,没有一个解决方案对我有效。我不知道该怎么办 这是REST服务的代码,它有AsyncResponse和@Suspended,它们取自pom.xml中指定的jar文件,我将在下面提供。问题是,在部署战争时,我遇到了一个例外: java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core
@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
我的班级如下:
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<User>> futures = executorService.submit(new DAOTaskHandlerThread(userid));
List <User> users = new ArrayList<User>();
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<User>().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<User>>{
//private UserDAO userDAO;
private String userid;
private DAOTaskHandlerThread(//UserDAO userDAO,
String useridpassed){
///this.userDAO= userDAO;
userid= useridpassed;
}
@Override
public List<User> call() throws Exception {
// TODO Auto-generated method stub
return userdao.getUsers(userid);
}
}
}
当应用程序试图调用抽象方法时抛出
uri
是中的一个抽象方法,因此需要实现它。此方法(带有String
参数)来自JAX-RS规范的2.0版本
您正在尝试将JAX-RS 2.0与Jersey 1一起使用。*。相反,您需要使用Jersey 2.*来实现JAX-RS 2.0,并包含对uri
方法的实现
在pom.xml
中,您可以删除这些依赖项:
泽西岛
从jersey common
初始化
编辑:
您需要在web.xml
中进行更改,servletcom.sun.jersey.spi.container.servlet.ServletContainer
到org.glassfish.jersey.servlet.ServletContainer
和init param
从com.sun.jersey.config.property.packages
到jersey.config.server.provider.packages
,我想为这篇文章添加一个答案。我今天遇到了一个类似的问题,并发现根本原因是另一个依赖jar,它在内部使用了较旧版本的Jersey/JAX-RS
修复前我的POM是:
<jersey.version>2.17</jersey.version>
...
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>com.ci.wrapper</groupId>
<artifactId>client-wrapper</artifactId>
<version>${clients-wrapper.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.api.commons</groupId>
<artifactId>transferobjects</artifactId>
<version>3.0.2</version>
</dependency>
2.17
...
org.glassfish.jersey.core
泽西服务器
${jersey.version}
org.glassfish.jersey.containers
jersey容器servlet核心
${jersey.version}
com.ci.wrapper
客户端包装器
${clients wrapper.version}
org.slf4j
slf4j api
com.api.commons
转移对象
3.0.2
问题在于“com.ci.wrapper”和“com.api.commons”。
他们包括两个不同的JAR,分别是BraveJersey和org.apache.cxf.cxf-rt-frontend-jaxrs(2.5.1),它们使用Jersey和JAX-rs1.X版本
排除嵌套jar并添加更新版本的BraveJersey2/org.apache.cxf.cxf rt前端JAXR(3.1.5)后,问题得到了解决
<dependency>
<groupId>com.api.commons</groupId>
<artifactId>transferobjects</artifactId>
<version>3.0.2</version>
<exclusions>
<exclusion>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<groupId>org.apache.cxf</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>com.ci.wrapper</groupId>
<artifactId>client-wrapper</artifactId>
<version>${clients-wrapper.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<artifactId>brave-jersey</artifactId>
<groupId>com.github.kristofa</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.kristofa</groupId>
<artifactId>brave-jersey2</artifactId>
<version>2.4.2</version>
</dependency>
com.api.commons
转移对象
3.0.2
cxf rt前端jaxrs
org.apache.cxf
org.apache.cxf
cxf rt前端jaxrs
3.1.5
com.ci.wrapper
客户端包装器
${clients wrapper.version}
org.slf4j
slf4j api
勇敢的球衣
com.github.kristofa
com.github.kristofa
勇敢的运动衫2
2.4.2
如果您面临类似问题,请检查包含的项目或jar是否可能使用不兼容版本的Jersey/Jax-RS。在我的情况下,需要删除cxf rt前端JAXR和httpclintjar两者的组合以解决问题。这两个JAR都有类javax.ws.rs.core.UriBuilder,这个类的多个版本导致了这个问题
我的pom对这两个罐子都有一个可传递的依赖关系,在移除它之后就可以工作了
enter code here
<exclusion>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
在此处输入代码
org.apache.cxf
cxf rt前端jaxrs
org.apache.httpcomponents
httpclient
当我试图在我的一个项目中使用库(自定义构建)时,我遇到了这个问题。
因此,问题是由于com.sun.jersey依赖项中的不匹配造成的。我的项目使用的是jersey版本2.15,而定制库提供的是com.sun.jersey版本1.17的过渡版本
那么如何发现这样的问题呢
使用gradle dependencies
任务找出依赖项(它给出嵌套级别的结果,这意味着所有可传递的依赖项也将显示出来)
一旦确定了导致依赖关系的问题。在项目中添加所需的依赖项时排除它们
例如。
httpRestClient是我想在项目中使用的自定义库的名称。
下面是我如何添加依赖项,同时排除组'com.sun.jersey'
compile(httpRestClient) {
exclude group: 'com.sun.jersey'
}
通过这种方式,您可以使用任何库并排除冲突库
谢谢。在我们的案例中,罪魁祸首就是这种依赖
<dependency>
<groupId>org.apache.wink</groupId>
<artifactId>wink-common</artifactId>
<version>1.0-incubating</version>
</dependency>
org.apache.wink
眨眼
1.0-孵化
这对我很有用。“编辑”是最基本的。谢谢!我试着这样做——不起作用——当应用程序与Jersey 2不兼容时,这不是一个解决方案,不幸的是,Jersey 2与Jersey 2不兼容☹@巴勃罗:首先,你需要了解行动的需要。例如,JAX-RS1.0没有异步行为——异步响应、挂起等,而且问题中的pom.xml
配置不好。因此,为了归档OP需求,使用JAX-RS 2.0是最好的选择,仅基于问题上下文。@BrunoCésar你是对的,我没有注意到这一部分。尽管如此,我还是会留下这个评论,因为在谷歌搜索这个异常时,这个问题很容易找到,而且不一定每个人都需要JAX-RS 2.0增强。我还想添加一个有趣的陷阱,如果你部署了一场装在旧球衣上的糟糕战争(至少在Jetty 9中),在没有这些依赖项的新WAR文件中进行热交换可能仍然会出现相同的错误;服务器需要完全重新启动。事后看来,这是显而易见的,但当我的头撞到这个错误上的时候就不是了