2016-05-10 5 views
2

Ich bin neu bei der Implementierung von REST-API-Diensten. Ich habe versucht, die einfachen Ressourcen zu implementieren. leider bin ich bei dieser ausnahme geblieben. Ich habe gegoogelt und viele Möglichkeiten ausprobiert, aber kein Glück. Ich bin mir nicht sicher, was falsch ist. Bitte hilf mir.java.lang.ClassCastException: org.glassfish.jersey.jackson.internal.JacksonAutoDiscoverable kann nicht in spi.AutoDiscoverable umgesetzt werden

  1. ein dynamisches Webprojekt "JersyJson" Erstellt
  2. ein resouce Erstellt genannt - JSONService.java (Quelle von googeln)
  3. Erstellt eine Java Bean-Klasse - Track.java (Quelle von googeln)
  4. konvertiert das Projekt in Maven Projekt
  5. eine Anwendungsdatei erstellt - JersyJson.java Datei für Anwendungs ​​Annotation
  6. die neueste Jersy Jars (Version: 2.22.2)
  7. Eingeführte & konfiguriert Jersey-media-json-Jackson und Jersey-media-moxy Gläser (2.22.2) in pom.xml

pom.xml

<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>JersyJson</groupId> 
    <artifactId>JersyJson</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>javax.ws.rs</groupId> 
      <artifactId>javax.ws.rs-api</artifactId> 
      <version>2.0.1</version> 
     </dependency> 
    <dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <!-- if your container implements Servlet API older than 3.0, use "jersey-container-servlet-core" --> 
    <artifactId>jersey-container-servlet</artifactId> 
    <version>2.22.2</version> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.22.2</version> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
    <version>2.22.2</version> 
</dependency> 

    </dependencies> 

    <build> 
    <sourceDirectory>src</sourceDirectory> 
    <plugins> 
     <plugin> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.3</version> 
     <configuration> 
      <source>1.8</source> 
      <target>1.8</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.6</version> 
     <configuration> 
      <warSourceDirectory>WebContent</warSourceDirectory> 
      <failOnMissingWebXml>false</failOnMissingWebXml> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>JersyJson</display-name> 


    <servlet> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
</servlet> 

    <servlet-mapping> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
    <url-pattern>/json/metallica/*</url-pattern> 
</servlet-mapping> 


</web-app> 

JersyJson.java (ApplicationAnnotation Datei)

@ApplicationPath("json") 
public class JersyJson extends ResourceConfig { 
    public JersyJson() { 
     packages("com.sai.jersyjson"); 
    } 
} 

JSONservice.java:

package com.sai.jersyjson; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 



@Path("/json/metallica") 
public class JSONService { 

    @GET 
    @Path("/get") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Track getTrackInJSON() { 

     Track track = new Track(); 
     track.setTitle("Enter Sandman"); 
     track.setSinger("Metallica"); 

     return track; 

    } 

    @POST 
    @Path("/post") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response createTrackInJSON(Track track) { 

     String result = "Track saved : " + track; 
     return Response.status(201).entity(result).build(); 

    } 

} 

Track.java (einfache Bean-Klasse)

package com.sai.jersyjson; 

public class Track { 

    String title; 
    String singer; 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getSinger() { 
     return singer; 
    } 

    public void setSinger(String singer) { 
     this.singer = singer; 
    } 

    @Override 
    public String toString() { 
     return "Track [title=" + title + ", singer=" + singer + "]"; 
    } 

} 

Nachdem ich dieses Projekt in eclispe mit Tomcat Webserver laufen, ich Erhalte folgenden Fehler mit 404-Error Status

SCHWEREN: StandardWrapper.Throwable java.lang.ClassCastException: org.glassfish.jersey.jackson.internal.JacksonAutoDiscoverable kann nicht auf org.glassfish.jersey.internal.spi.AutoDiscoverable bei org.glassfish.jersey gegossen werden .model.internal.CommonConfig $ 2.compare (CommonConfig.java:594) bei java.util.TreeMap.put (Unbekannte Quelle) bei java.util.TreeSet.add (Unbekannte Quelle) bei java.util.AbstractCollection. addAll (Unknown Source) bei java.util.TreeSet.addAll (Unknown Source) bei org.glassfish.jersey.model.internal.CommonConfig.configureAutoDiscoverableProviders (CommonConfig.java:616) bei org.glassfish.jersey.server. Re sourceConfig.configureAutoDiscoverableProviders (ResourceConfig.java:811) bei org.glassfish.jersey.server.ApplicationHandler.initialize (ApplicationHandler.java:447) bei org.glassfish.jersey.server.ApplicationHandler.access $ 500 (ApplicationHandler.java:184) bei org.glassfish.jersey.server.ApplicationHandler $ 3.call (ApplicationHandler.java:350) bei org.glassfish.jersey.server.ApplicationHandler $ 3.call (ApplicationHandler.java: 347) bei org.glassfish.jersey.internal.Errors.process (Errors.java:315) bei org.glassfish.jersey.internal.Errors.process (Errors.java:297) bei org.glassfish. jersey.internal.Errors.processWithException (Fehler.java:255) bei org.glassfish.jersey.server.ApplicationHandler. (ApplicationHandler.java:347) bei org.glassfish.jersey.servlet.WebComponent. (WebComponent.java: 392) bei org.glassfish.jersey.servlet.ServletContainer.init (ServletContainer.java:177) bei org.glassfish.jersey.servlet.ServletContainer.init (ServletContainer.java:369) bei javax.servlet.GenericServlet. init (GenericServlet.java:158) bei org.apache.catalina.core.StandardWrapper.initServlet (StandardWrapper.java:1238) bei org.apache.catalina.core.StandardWrapper.load (StandardWrapper.java:1041) bei org.apache.catalina.core.StandardContext.loadOnStartup (StandardContext.java:4996) bei org.apache.catalina.core. StandardContext.startInternal (StandardContext.java:5285) bei org.apache.catalina.util.LifecycleBase.start (LifecycleBase.java:147) bei org.apache.catalina.core.ContainerBase $ StartChild.call (ContainerBase.java: 1408) bei org.apache.catalina.core.ContainerBase $ StartChild.call (ContainerBase.java:1398) bei java.util.concurrent.FutureTask.run (Unknown Source) bei java.util.concurrent.ThreadPoolExecutor.runWorker (Unbekannte Quelle) bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (Unbekannte Quelle) bei java.lang.Thread.r un (Unbekannte Quelle)

+0

Warum erstellen Sie ein dynamisches Webprojekt und konvertieren es dann in Maven. Warum fängst du nicht einfach von Anfang an mit Maven an? –

+0

Werfen Sie einen Blick auf [diese] (http://paulsamtha.blogspot.com/2015/10/getting-started-with-jersey-2.html) –

+0

Vielen Dank @peeskillet für die Antwort. Ich habe versucht, das Maven-Projekt direkt in Eclipse zu erstellen und die Schritte genau wie in dem von Ihnen angegebenen Link ausgeführt. Es funktionierte. Danke dafür. Aber ich verstehe von der Verbindung, es benutzt Anlegestegbehälter. Ich wollte die Jersey-Applikation mit Tomcat laufen lassen. Wenn ich die generierte WAR-Datei mit Tomcat Webcontainer testen möchte, sollte ich eine andere Konfiguration für die Bereitstellung benötigen? Tatsächlich habe ich den Buildpfad mit den benötigten Jersey-Jars konfiguriert und versucht, mit der Option in Eclipse 'Run As' -> 'Run on Server' mit Tomcat zu laufen. Ich bekomme den gleichen Fehler. – Suri

Antwort

0

Ich hatte genau das gleiche Problem in Weblogic. Es scheint zu sein, dass die JacksonAutoDiscoverable und AutoDiscoverable von verschiedenen Klassenladegeräten und daher verschiedenen Versionen kamen. AutoDiscoverable existiert in Jersey-common und JacksonAutoDiscoverable existiert in Jersey-media-json-jackson.

Ich habe diese um Weblogic, indem wir haben alle auffindbar Klassen und stattdessen die Angabe ‚com.fasterxml.jackson. *‘ Als bevorzugen applikations packages/Ressourcen auf meine eigene Version von jackson haben.

+0

können Sie bitte Bibliotheken bereitstellen, wenn Sie haben? –