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.
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.
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.
So habe ich das Problem gelöst.
Gebraucht Jackson. Diese Gläser hinzugefügt
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);
}
}
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);
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.
Es funktionierte für mich, indem alle benötigten Jackson-Gläser hinzugefügt wurden
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
}