wake-up-neo.net

MessageBodyWriter nicht gefunden für Medientyp = application / json

Beim Konsumieren von JAX-RS-Diensten als JSON treten Probleme auf.

Unten habe ich meinen Code hinzugefügt.

Dies ist meine Serviceklasse:

//Sets the path to base URL + /hello
@Path("/hello") 
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class Hello {

    @GET
    @Produces("application/json")
    public Student getStudent() {

        Student s = new Student();
        s.first_name = "Test First Name !!!";
        s.last_name = "Test Last Name!!!";

        return s;
    }

Student Klasse, die ich vom Dienst erhalten möchte:

@XmlRootElement
public class Student implements Serializable {

    public String first_name;
    public String last_name;

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }

    public String getLast_name() {
        return last_name;
    }

    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }

    public Student()
    {
        first_name = "Fahad";
        last_name = "Mullaji";
    }
}

Service-seitiges 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>com.vogella.jersey.first</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <!-- Register resources and providers under com.vogella.jersey.first package. -->
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.vogella.jersey.first</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>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app> 

Ich weiß nicht, wie ich dieses Problem beheben soll. Ich verwende SOAP UI zum Testen der JSON-Antwort, aber ich denke, dass es keine Rolle spielen sollte.

An vielen Stellen habe ich gelesen, dass ich den folgenden Code hinzufügen muss. Aber ich weiß nicht wo. Ich benutze Maven nicht zum Bauen.

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

Der Server sucht nach einer Funktion zum Parsen des Student -Objekts nach JSON, kann jedoch keine Funktion oder JAR-Datei dafür finden. Ich habe Glas Genson, Moxy, RESTEasy und Jackson hinzugefügt, aber ich denke, das ist das Problem. Ich glaube, ich vermisse irgendwo eine Zuordnung.

61
Fahad Mullaji

Nun, ich konnte das obige Webprojekt nicht zum Laufen bringen. Aber ich habe weiter an JAX-RS geforscht und bin auf Stormpaths Tutorial gestoßen. Ich denke, wer versucht zu lernen, wie REST, JSON und Jersey zusammenarbeiten, sollte dies beobachten.

Die Präsentation und das Beispiel des Projekts auf GitHub finden Sie unter den folgenden Links: REST.

https://www.youtube.com/watch?v=sVvL12BnIyQ

https://github.com/stormpath/todos-jersey

Jetzt kann ich das obige Projekt vergleichen und sehen, was ich alles falsch gemacht habe.

6
Fahad Mullaji

Ich konnte es beheben, indem ich jersey-media-json-jackson installierte

Fügen Sie die Abhängigkeit zu pom.xml hinzu

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <scope>runtime</scope>
</dependency>
97
Alicia Tang

Sie müssen einen leeren Konstruktor erstellen, da JAX-RS die Klassen initialisiert ... Ihr Konstruktor darf keine Argumente enthalten:

@XmlRootElement
public class Student implements Serializable {

    public String first_name;
    public String last_name;

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }

    public String getLast_name() {
        return last_name;
    }

    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }

    public Student()
    {
        first_name = "Fahad";
        last_name = "Mullaji";
    }


 public Student()
    {
    }
}
53
asad.qazi

Ich war in der gleichen Situation wo
- Ich habe nicht Maven oder Ant benutzt,
- Ich beendete dieses Vogella-Tutorial auf Jersey ,
- und ich habe den Fehler MessageBodyWriter erhalten, als ich versucht habe, @Produces(MediaType.APPLICATION_JSON) zu verwenden.

Diese Antwort von @peeskillet löst das Problem - Sie müssen die Jackson * .jar-Dateien verwenden, die von der FasterXML Jackson-Download-Seite verfügbar sind =. Sie benötigen die core -Dateien sowie die jaxrs -Dateien.

Ich habe sie meinem Ordner WebContent/WEB-INF/lib Hinzugefügt, in dem ich meine Jersey * .jar-Dateien gemäß dem obigen Tutorial habe, und die kleine Änderung an der Datei web.xml unten vorgenommen (erneut, wie ursprünglich von @peeskillet freigegeben):

<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
    your.other.package.here, com.fasterxml.jackson.jaxrs.json 
</param-value>

Der wichtige Teil ist com.fasterxml.jackson.jaxrs.json.

17
amess

Das Auskommentieren des folgenden Codes hat geholfen

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

die Datei pom.xml in meinem Maven-basierten Projekt behebt diesen Fehler für mich.

14
Saurabh Thakur

Unten sollte in Ihrer pom.xml über anderen Jersey/Jackson-Abhängigkeiten stehen. In meinem Fall ist es wie folgt Jersey-Client-Abhängigkeit und ich habe MessageBodyWriter nicht gefunden für Medientyp = Anwendung/Json.

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

Ich denke, vielleicht solltest du versuchen, die Daten in das json-Format zu konvertieren. Dies kann mit gson lib geschehen. Versuchen Sie etwas wie unten.

Ich weiß nicht, ob es die beste Lösung ist oder nicht, aber Sie könnten es auf diese Weise tun. Es hat bei mir funktioniert

beispiel: `

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response info(@HeaderParam("Accept") String accept) {
    Info information = new Info();
    information.setInfo("Calc Application Info");
    System.out.println(accept);
    if (!accept.equals(MediaType.APPLICATION_JSON)) {
        return Response.status(Status.ACCEPTED).entity(information).build();
    } else {
        Gson jsonConverter = new GsonBuilder().create();
        return Response.status(Status.ACCEPTED).entity(jsonConverter.toJson(information)).build();
    }
}
1
sajan

Versuchen Sie Folgendes, um dieses Problem zu beheben. Hat für mich gearbeitet.

Fügen Sie folgende Abhängigkeit in das pom.xml ein

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

Und stellen Sie sicher, dass Modellklassekein Argumentkonstruktor enthält

 public Student()
    {
    }
1
Dulith De Costa