Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JAX-RS上使用UriBuilder时出现AbstractMethodError_Java_Maven_Jersey_Jax Rs - Fatal编程技术网

Java 在JAX-RS上使用UriBuilder时出现AbstractMethodError

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

我正在尝试使用异步响应构建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
我的班级如下:

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
中进行更改,servlet
com.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前端JAXRhttpclintjar两者的组合以解决问题。这两个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文件中进行热交换可能仍然会出现相同的错误;服务器需要完全重新启动。事后看来,这是显而易见的,但当我的头撞到这个错误上的时候就不是了