webentwicklung-frage-antwort-db.com.de

"MessageBodyWriter für Medientyp = application/json nicht gefunden" beim Versuch, ein JSON-Objekt über den JAX-RS-Webdienst zu senden, erhalten

Ich versuche, ein JSON-Objekt über einen JAX-RS-Webdienst zu senden .. __ Meine Datei web.xml lautet:

<servlet>
 <description>JAX-RS Tools Generated - Do not modify</description>
 <servlet-name>JAX-RS Servlet</servlet-name>
 <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>it.notifire</param-value>
  </init-param>
  <init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>JAX-RS Servlet</servlet-name>
  <url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>

Die Klasse, die das Objekt modelliert, das ich senden möchte, lautet:

public class GPSCoordinate {

private float latitudine;
private float longitudine;

 public float getLatitudine() {
    return latitudine;
}
public void setLatitudine(float latitudine) {
     this.latitudine = latitudine;
}
public float getLongitudine() {
    return longitudine;
}
public void setLongitudine(float longitudine) {
    this.longitudine = longitudine;
}
}

Die Wurzelklassenressource ist:

@Path("position")
public class Position {

    @Context
private UriInfo context;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public GPSCoordinate getHTML() {

        GPSCoordinate coord = new GPSCoordinate();
        coord.setLatitudine(90.45f);
        coord.setLongitudine(34.56f);

        return coord;
    }
}

Wenn ich jetzt versuche, auf den Dienst zuzugreifen, verweise ich meinen Browser auf den folgenden Link

http://localhost:8080/Notifire/jaxrs/position

und ich erhalte folgende Fehlermeldung:

nachricht org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter für Medientyp = application/json nicht gefunden

In meinem Ordner WEB-INF/lib habe ich die letzte Version der Jersey-JAX-RS-Implementierung (jaxrs-ri-2.5.jar) und das Archiv jersey-json.jar.

Jede Hilfe wäre sehr dankbar.

24
amedeo avogadro

Fügen Sie Ihrem Klassenpfad Genson hinzu. Dadurch wird die JSON-Unterstützung automatisch aktiviert.

Genson ist eine Datenbindungs- und Streaming-Bibliothek für Json und Java/Scala. Es implementiert die Erweiterungspunkte MessageBodyReader/Writer von JAX-RS, so dass Jersey automatisch Genson erkennt und für das Json-Parsen/Schreiben verwendet.

Weitere Informationen zur Gensons-Integration mit JaxRS (Jersey & cie) finden Sie hier.

52
eugen

Jersey unterstützt "autodiscoverable" -Funktionen. JSON-Unterstützung ist eine davon. Um es zu aktivieren, müssen Sie gemäß the docs eine kompatible Bibliothek zu Ihrem Pfad hinzufügen.

Während die empfohlene jersey-media-json-processing-Bibliothek in meinem Fall aus irgendeinem Grund nicht erkannt wurde, hat jersey-media-moxy:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.15</version>
</dependency>

2.15 war zum Zeitpunkt des Schreibens die neueste Version. Besuchen Sie die zentrale Artefakt-Seite maven , um die aktuelle Version zu finden.

9
kostja

So habe ich das Problem gelöst. 

Gebraucht Jackson. Diese Gläser hinzugefügt enter image description here

Diese Klasse wurde meinem Projekt hinzugefügt. Die Schlüsselzeilen des Codes sind WICHTIG markiert. 

import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; <-- IMPORTANT
import Java.util.HashSet;
import Java.util.Set;
import javax.ws.rs.core.Application;

//@javax.ws.rs.ApplicationPath("webresources")
public class MyApplicationConfig extends Application {

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> resources = new Java.util.HashSet<Class<?>>();
    //addRestResourceClasses(resources);
    //resources.add(MultiPartFeature.class);
    //resources.add(JettisonFeature.class);
    return resources;
}

@Override
public Set<Object> getSingletons() {
    final Set<Object> instances = new HashSet<Object>();

    instances.add(new JacksonJsonProvider()); <--------- IMPORTANT
    return instances;
}
/**
 * Do not modify addRestResourceClasses() method.
 * It is automatically populated with
 * all resources defined in the project.
 * If required, comment out calling this method in getClasses().
 */
private void addRestResourceClasses(Set<Class<?>> resources) {
    //resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);
    //resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);

}

}
4
bickster

Registrieren Sie die JacksonJsonProvier-Klasse mit der Client-Konfiguration und erstellen Sie dann das Client-Objekt. Dies hat für mich funktioniert. Unten ist der Code.

    ClientConfig config = new ClientConfig();
    config.register(JacksonJsonProvider.class);
    Client client = ClientBuilder.newClient(config);
4
lakshmanas

Meine Hauptursache war etwas anders. Ich habe einige Zeit damit verbracht, den Quellcode von Jersey zu debuggen, und es stellte sich heraus, dass es nicht möglich ist, eine JAXBContext zu erstellen, da der Standardkonstruktor in meiner JAXB-Klasse fehlt. Dies geschieht während der Suche nach einem geeigneten MessageBodyWriter, die Ausnahme wird jedoch nicht behandelt.

Hier ist das entsprechende Code-Snippet (MOXyJsonProvider: 324):

try {
    Set<Class<?>> domainClasses = getDomainClasses(genericType);
    return getJAXBContext(domainClasses, annotations, mediaType, null);
} catch(JAXBException e) {
    return null;
}

Wenn Sie also die Moxy-JSON-Abhängigkeit in POM haben, überprüfen Sie noch einmal, ob Ihre JAXB-Klassen gültig sind.

Von mir verwendete Versionen: Jersey 2.19, Moxy 2.6.0.

2
jFrenetic

Es funktionierte für mich, indem alle benötigten Jackson-Gläser hinzugefügt wurden

  • jackson-annotations-2.8.7.jar, 
  • jackson-core-2.8.7.jar
  • jackson-databind-2.8.7.jar
  • jackson-jaxrs-base-2.8.7.jar
  • jackson-jaxrs-json-provider-2.8.3.jar
  • jackson-module-jaxb-annotations-2.8.7.jar
0
Hemant Daga

Gehen Sie zu https://jersey.Java.net/documentation/2.5.1/user-guide.html#json

Sie müssen Ihre Klasse abschließen ... JAXB benötigt das zum Beispiel:

@XmlRootElement
public class MyJaxbBean {

    @XmlElement(name="king")
    public String name;

    @XmlTransient
    public int age;

    // several lines removed
}
0
Rod SolPar