it-swarm.com.de

AbstractMethodError mit UriBuilder unter JAX-RS

Ich versuche, einen REST - Webservice mit einer asynchronen Antwort zu erstellen.

Ich habe mir diesen Fehler im Web angesehen, jedoch hat keine der Lösungen für mich funktioniert. Ich bin nicht sicher, wie ich vorgehen soll.

Dies ist der Code für den REST - Dienst. Er hat AsyncResponse und @Suspended, die aus der JAR-Datei stammen, die in der pom.xml-Datei angegeben ist. Das Problem ist, beim Auslösen des Krieges bekomme ich eine Ausnahme:

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

Meine Klasse ist wie folgt:

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);
        }

    }

}

Meine pom.xml-Datei für Maven lautet wie folgt:

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>RESTJerseyExample</groupId>
    <artifactId>RESTJerseyExample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <!-- spring framework just added -->

    <properties>
        <Java-version>1.7</Java-version>
        <org.springframework-version>4.0.3.RELEASE</org.springframework-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${org.springframework-version}</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <!-- spring framework just added ends here -->

        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-bundle</artifactId>
            <version>1.19</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20140107</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.19</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>1.19</version>
        </dependency>
        <dependency>
            <groupId>org.Apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.0</version>
        </dependency>
        <!--  used for httpclient library -->   
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>org.Apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.2</version>
        </dependency>
        <!--  for async response  -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0-m12</version>
        </dependency>
    </dependencies>
</project>
26
user471450

AbstractMethodError werden geworfen, wenn eine Anwendung versucht, eine abstrakte Methode aufzurufen.

uri ist eine abstrakte Methode in UriBuilder , daher benötigen Sie eine Implementierung davon. Diese Methode (mit dem Parameter String) stammt von der Version 2.0 der JAX-RS-Spezifikation.

Sie versuchen, JAX-RS 2.0 mit Jersey 1 zu verwenden. *. Stattdessen müssen Sie Jersey 2 verwenden. *, Das JAX-RS 2.0 implementiert und eine Implementierung der uri-Methode enthält.

In Ihrem pom.xml können Sie diese Abhängigkeiten entfernen:

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.19</version>
</dependency>
<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.19</version>
</dependency>
<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.19</version>
</dependency>
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0-m12</version>
</dependency>

Und nutzen Sie diese Abhängigkeiten:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.17</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.17</version>
</dependency>

Mit dieser Methode wird die uri-Methode in JerseyUriBuilder class von jersey-common implementiert.

EDIT:

Sie müssen in Ihrem web.xml Servlet com.Sun.jersey.spi.container.servlet.ServletContainer in org.glassfish.jersey.servlet.ServletContainer und init-param von com.Sun.jersey.config.property.packages in jersey.config.server.provider.packages ändern.

51
Bruno César

Ich möchte diesem Beitrag eine Antwort hinzufügen. Ich sah mich heute einem ähnlichen Problem gegenüber und stellte fest, dass die Hauptursache ein weiteres abhängiges Glas war, nämlich Intern mit einer älteren Version von Jersey/JAX-RS.

Mein POM vor dem Update war:

<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>

Das Problem war mit "com.ci.wrapper" und "com.api.commons" . Sie enthielten zwei verschiedene JARs von BraveJersey und org.Apache.cxf.cxf-rt-frontend-jaxrs (2.5.1). welche Jersey- und JAX-RS 1.X-Versionen verwendeten.

Nach dem Ausschließen des verschachtelten Glases und dem Hinzufügen der neueren Versionen von BraveJersey2/org.Apache.cxf.cxf-rt-frontend-jaxrs (3.1.5) wurde es behoben.

<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>

Falls Sie mit einem ähnlichen Problem konfrontiert sind, überprüfen Sie bitte, ob für das Projekt oder das Gefäß included eine inkompatible Version von Jersey/Jax-RS verwendet werden kann.

8
Bandi Kishore

Ich bin mit diesem Problem konfrontiert, als ich versuchte, eine Bibliothek (benutzerdefiniert erstellt) in einem meiner Projekte zu verwenden ... Das Problem trat also auf, weil in den Abhängigkeiten von com.Sun.jersey ein Konflikt bestand. In meinem Projekt wurde die Trikotversion 2.15 verwendet, während die benutzerdefinierte Bibliothek mir com.Sun.jersey von Version 1.17 transitiv gab.

So finden Sie solche Probleme.

Verwenden Sie die Aufgabe gradle dependencies, um die Abhängigkeiten herauszufinden (verschachtelte Ebenenergebnisse, dh alle transitiven Abhängigkeiten werden ebenfalls angezeigt).

Sobald Sie das Problem identifiziert haben, das Abhängigkeiten verursacht. Schließen Sie sie aus, während Sie die erforderlichen Abhängigkeiten im Projekt hinzufügen.

Beispielsweise ist httpRestClient der Name meiner benutzerdefinierten Bibliothek, die ich in meinem Projekt verwenden wollte .. So habe ich nun die Abhängigkeit hinzugefügt und gleichzeitig die gegensätzlichen Abhängigkeiten der Gruppe 'com.Sun.jersey' ausgeschlossen.

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

Auf diese Weise können Sie eine beliebige Bibliothek verwenden und die in Konflikt stehenden Bibliotheken ausschließen.

Vielen Dank.

3
Sanjay Bharwani

In meinem Fall muss die Kombination von cxf-rt-frontend-jaxrs und httpclint jar entfernt werden, um das Problem zu beheben. Beide Gläser haben die Klasse javax.ws.rs.core.UriBuilder, die mehrere Versionen dieser Klasse verursachten das Problem. 

Mein Pom hatte eine transitive Abhängigkeit von diesen beiden Gläsern, nachdem er entfernt worden war.

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>
1
lakshmanas

In unserem Fall war der Täter diese Abhängigkeit

<dependency>
    <groupId>org.Apache.wink</groupId>
    <artifactId>wink-common</artifactId>
    <version>1.0-incubating</version>
</dependency>
0
Rohan