wake-up-neo.com

Jersey: Es wurde kein Body-Writer für Java Class und MIME-Mediatyp/Json gefunden

nachdem ich herausgefunden hatte, was mein Problem ist, entschied ich mich schließlich, Sie zu fragen, wie ich mein Problem lösen kann. Ich habe verschiedene Menschen mit dem gleichen Problem gesehen und habe alles versucht, was ihnen empfohlen wurde, aber nichts half bei meinem Problem. Im Grunde habe ich einen RESTful Service, den ich mit Jersey baue. Für meinen Kunden möchte ich ein Objekt im JSON-Format zurückgeben. Ich habe verschiedene Tutorials durchgelesen und entschieden, dass es sinnvoll ist, die Jersey-Json-1.8-Bibliothek zu verwenden. Ich habe alles wie üblich zu meinem Projekt hinzugefügt und versucht, es auszuführen, aber jedes Mal, wenn ich den Dienst (über get request atm.) Anrufe, erhalte ich HTTP Error Code 500 (interner Serverfehler) und mein Server antwortet, dass kein Nachrichtentext vorliegt Schriftsteller konnte gefunden werden. Wenn ich XML zurücksende, funktioniert es gut und alles ist großartig. Ich habe auch versucht, jersey-json-1.8.jar in meinen Tomcat-lib-Ordner zu kopieren, da ich dies mit der von mir verwendeten mysql-lib tun musste, aber es half auch nicht ... Ich wäre sehr froh, wenn Sie helfen könnten Ich raus, um dieses Zeug zum Laufen zu bringen! Wenn Sie weitere Informationen benötigen, hinterlassen Sie einfach einen Kommentar und ich gebe ihn so schnell wie möglich an. :)

Mein Projekt-Setup ist: 3 Verschiedene Pakete 1. Meine RESTfulServices 2. Meine Java-Arbeit, bei der ich mit SQL-Verbindungen usw. arbeite. 3. Ein Paket, in dem ich alle meine Modelle ablege, mit denen ich arbeiten möchte und die ich im JSON-Format zurückgeben möchte (in meinem Beispiel eine Route für ein Testlaufwerk).

Ein Tomcat-Webserver IDE: Eclipse Ich verwende Maven

Egal was oder wie ich versuche, das Objekt zurückzugeben, es funktioniert einfach nicht und ich bekomme ständig die Fehlermeldung:

Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.Sun.jersey.api.MessageException: A message body writer for Java class com.mykong.models.Teststrecke, and Java type class com.mykong.models.Teststrecke, and MIME media type application/json was not found

EDIT: Hier ist meine JSON-Servicemethode

@Path("/hellojson")
public class JSONService {


    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public ArrayList<Route> getJSONMsg()  
    {

        Route ts = new Route();
        ts.setId(1);
        ts.setName("HelloWorld");


        Route ts2 = new Route();
        ts2.setId(2);
        ts2.setName("HelloWorld");


        ArrayList<Route> availRoutes = new ArrayList<Route>();
        availRoutes.add(ts);
        availRoutes.add(ts2);


        return availRoutes;


    }
}
19
dhartwich

Versuchen Sie, die Genson-Bibliothek zu Ihrem Klassenpfad http://owlike.github.io/genson/ ..__ hinzuzufügen. Dies ist ein Java-Streaming- und Datenbindungs-API von Json <>. Es lässt sich gut mit Trikot integrieren. Um Sie zum Laufen zu bringen, benötigen Sie 0 Konfigurationen. Jersey erkennt, dass sich die Bibliothek in Ihrem Klassenpfad befindet, und aktiviert die Json-Zuordnung durch Delegieren an Genson.

46
eugen

Fügen Sie diese Abhängigkeiten in Ihre POM.xml ein und führen Sie Maven -> Update aus

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
   <groupId>com.owlike</groupId>
   <artifactId>genson</artifactId>
   <version>0.99</version>
</dependency>
14
borchvm

Durch Hinzufügen der Abhängigkeit wurde mein Problem behoben. Ich habe per @eugen versucht, eine Genson-Abhängigkeit hinzuzufügen, die dabei geholfen hat, die Ausnahme zu beseitigen, jedoch hat mein Server aus irgendeinem Grund 400 eine schlechte Anforderung ausgelöst. Es scheint, dass Genson die Json-Anfrage nicht ordnungsgemäß streamen konnte. Aber unter Abhängigkeit funktionierte gut. Ich hoffe, es hilft anderen, da dieses Problem mich verrückt machte!

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.3.0</version>
</dependency>
11
nilesh

Das Verschieben der jersey-json-Abhängigkeit auf die oberste Ebene von pom.xml hat dieses Problem für mich gelöst.

<dependencies>
  <dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
  </dependency>

  <!-- other dependencies -->

</dependencies>
3
supercobra

Überprüfen Sie im Paket-Explorer unter Maven-Abhängigkeiten. Wenn Sie dies oder jersey-bundle-1.8.jar nicht sehen, haben Sie wahrscheinlich nur jersey-server angegeben. Ändern Sie die Abhängigkeit in pom.xml in jersey-bundle und es sollte funktionieren.

2
Anthony

Jersey 2.4: Auch ich war mit diesem Problem konfrontiert und dieses Posting hilft jemandem. Ich habe dies von der Jersey API-Spezifikation für die JSON-Integration übernommen: ( https://jersey.Java.net/documentation/latest/user-guide.html#json )

Ich habe Jettison für die Integration mit Jersey mit JSON verwendet. Aber selbst nachdem ich alle Bibliotheken hinzugefügt hatte, bekam ich den Fehler: Ein Nachrichtentext für Java Class und MIME Mediatyp Application/Json wurde nicht gefunden

Es geht darum, die richtigen Bibliotheken hinzuzufügen und Funktionen zu registrieren.> Ich habe zusätzlich zu den anderen, die Jersey bietet, eine zusätzliche Bibliothek hinzugefügt: jersey-media-json-jettison-2.4.jar. Und den folgenden Code hinzugefügt, um Jettison Feature zu registrieren. 

   public class MyApplication extends ResourceConfig{
      public MyApplication() {
          register(JettisonFeature.class);
          packages("org.XXX.XXX.XXX");   
    }
1
Jasmine

Das obige Problem wird gelöst, indem die Jackson-Bibliothek anstelle des Gensons verwendet wird.

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.0</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.2</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.25</version>
    </dependency>

Wie in meinem Fall gab Genson einen leeren Json in der Antwort, wird aber in Ordnung sein, wenn wir den Json in einen String konvertieren. Eine unerwünschte Ausgabe wird jedoch erstellt, da Sie in der Antwort einen String und keinen Json erhalten werden die Jackson-Bibliothek, die es sehr leicht macht.

Hinweis: Jackson konvertiert Ihre Antwort nur in json, wenn die Klasse das serialisierbare Interface implementiert. Wenn Sie also JSONObject senden, senden Sie die JSONObject-Liste.

0
Prakhar Agrawal

@Produces entfernen (MediaType.APPLICATION_JSON); Verwenden Sie die Datei JSONLibraries.Zip, um Ihre Daten in und aus JSON zu konvertieren. Es funktioniert einwandfrei. Das Problem mit dem obigen Code ist, dass er die Kombination von Maven und Jackson verwendet. APPLICATION_JSON kann also nicht gefunden werden, wenn Sie nur Jersey verwenden . Ich habe mit to/from JSON-Konvertierungssachen gearbeitet.

Code:

@Path("/hellojson")
public class JSONService {

    @GET
    public ArrayList<Route> getJSONMsg()  
    {

        Route ts = new Route();
        ts.setId(1);
        ts.setName("HelloWorld");

        Route ts2 = new Route();
        ts2.setId(2);
        ts2.setName("HelloWorld");

        ArrayList<Route> availRoutes = new ArrayList<Route>();
        availRoutes.add(ts);
        availRoutes.add(ts2);

        return JSONObject.fromObject(availRoutes.toString()));
    }
}
0
MankitaP

Diese Frage wurde vor einiger Zeit gestellt. Beachten Sie jedoch, dass der Jersey-Servlet-Container einen eigenen POJO-Mapper hat.

Aktivieren Sie es, indem Sie Ihrer web.xml Folgendes hinzufügen

<init-param>
    <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

Ich habe einige Unstimmigkeiten bei der Zuordnung von Objekten auf Jersey und Genson festgestellt. Wenn zum Beispiel eine Klasse ein Feld vom Typ A hat, das auf eine Instanz von B gesetzt ist, die A erweitert, wird Genson B nicht ordnungsgemäß serialisieren, während Jersey dies tut.

0
allenwoot