it-swarm.com.de

VERSCHIEDENES: MessageBodyWriter nicht gefunden für Medientyp = Anwendung / json, Typ = Klasse com.jersey.jaxb.Todo, genericType = Klasse com.jersey.jaxb.Todo

Ich versuche, einen RESTful-Webdienst zu erstellen, und ich habe einen erstellt, aber ich erhalte einen

MessageBodyWriter nicht gefunden für Medientyp = application/json-Fehler

Meine Todo Klasse:

package com.jersey.jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.pojomatic.Pojomatic;
import org.pojomatic.annotations.AutoProperty;

@XmlRootElement
@XmlType(name = "todo")
@XmlAccessorType(XmlAccessType.FIELD)
@AutoProperty
public class Todo {

    @XmlElement(name = "summary")
    private final String summary;

    @XmlElement(name = "description")
    private final String description;

    public String getSummary() {
        return summary;
    }

    public String getDescription() {
        return description;
    }

    public Todo() {
        this(new Builder());    
    }

    public Todo(Builder builder) {
        this.summary = builder.summary;
        this.description = builder.description;
    }

    @Override
    public boolean equals(Object o) {
        return Pojomatic.equals(this, o);
    }

    @Override
    public int hashCode() {
        return Pojomatic.hashCode(this);
    }

    @Override
    public String toString() {
        return Pojomatic.toString(this);
    }

    public static class Builder {
        private String description;
        private String summary;

        public Builder summary(String summary) {
            this.summary = summary;
            return this;
        }

        public Builder description(String description) {
            this.description = description;
            return this;
        }

        public Todo build() {
            return new Todo(this);
        }
    }
}

Und meine Ressource: -

package com.jersey.jaxb;

import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

@Path("/todo")
public class TodoResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getTodo(){
        Todo todo = new Todo.Builder().description("My Todo Object").summary("Created").build();
        return Response.status(Status.OK).entity(todo).build();
    }

}

Meine 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" xmlns:web="http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<display-name>MyFirstWebService</display-name>
<servlet>
  <servlet-name>Jersey REST Service</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
   <init-param>
     <param-name>jersey.config.server.provider.packages</param-name>
     <param-value>com.jersey.jaxb</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>  

Meine Bibliotheken:

aopalliance-repackaged-2.4.0-b10.jar
asm-debug-all-5.0.2.jar
hk2-api-2.4.0-b10.jar
hk2-locator-2.4.0-b10.jar
hk2-utils-2.4.0-b10.jar
jackson-jaxrs-json-provider-2.2.3.jar
javassist-3.18.1-GA.jar
javax.annotation-api-1.2.jar
javax.inject-2.4.0-b10.jar
javax.servlet-api-3.0.1.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.7.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet.jar
jersey-container-servlet-core.jar
jersey-guava-2.17.jar
jersey-media-jaxb.jar
jersey-server.jar
org.osgi.core-4.2.0.jar
osgi-resource-locator-1.0.1.jar
persistence-api-1.0.jar
validation-api-1.1.0.Final.jar

Wenn ich diese Anwendung auf einem Tomcat-Server ausführe und diese ausführe: http: // localhost: 8080/MyFirstWebService/rest/todo

Ich erhalte den Fehler:

VERSCHIEDENES: MessageBodyWriter nicht gefunden für Medientyp = Anwendung/json, Typ = Klasse com.jersey.jaxb.Todo, genericType = Klasse com.jersey.jaxb.Todo.

31
Raj Hassani

Du hast jackson-jaxrs-json-provider das ist ein Anfang ..

Aber ...

dieses Artefakt hängt immer noch von Jacskon selbst ab, der all diese Artefakte enthält

enter image description here

Deshalb verwenden wir Maven[ 1 ] (um so etwas müssen wir uns also keine sorgen machen :-). Also suchen Sie diese.

Fügen Sie dann einfach das Paket zur Datei web.xml hinzu, und es sollte funktionieren

<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
    com.jersey.jaxb,
    com.fasterxml.jackson.jaxrs.json
</param-value>

1. Maven-Abhängigkeit

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.2.3</version>
</dependency>

Oder verwenden Sie für die oben angegebene Abhängigkeit die unten stehende Jersey- "Hülle". Es werden die Jackson-Provider registriert (daher müssen wir uns nicht wie oben explizit registrieren), und die Jackson-Exception-Mapper bieten ab Version 2.17 Unterstützung für Entity Data Filtering .

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey2.version}</version>
</dependency>

Hinweis: Die Tatsache, dass wir nichts mit der obigen Abhängigkeit registrieren müssen, wird durch die Auto-Discovery-Funktion ermöglicht aus Jersey. Wenn wir aus irgendeinem Grund die automatische Erkennung deaktivieren, möchten Sie das JacksonFeature explizit registrieren.

49
Paul Samsotha

Die Lösung könnte darin bestehen, sicherzustellen, dass die Modellklassen einen Konstruktor ohne Argumente haben.

Und füge diese Abhängigkeit zu deiner pom.XML hinzu:

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

Ich hatte das gleiche Problem, ich löste es, indem ich der Klasse einen leeren Konstruktor hinzufügte

public SandBoxClass(){} //-> solved the issue**

public SandBoxClass(Integer arg1, Integer arg2) {
        this.arg1=arg1;
        this.arg2=arg2;
}
8
zelli79

Wenn Sie bereits die Jersey-Media-Moxy-Abhängigkeit in Ihrer pom.xml hinzugefügt haben. Stellen Sie sicher, dass Ihre Entitätsklasse den Standardkonstruktor hat. Dieses Problem trat auf, als ich einen paramatrisierten Konstruktor in die Modellklasse einführte. Das erneute Hinzufügen des Standardkonstruktors hat bei mir funktioniert.

3
Chandan Kumar
  1. Aktualisieren Sie nur die Bibliotheken Jax-RS 2.0 und Jersey 2.5.1 (JAX-RS-RI)
  2. Das Return Bean-Objekt (todo) antwortet nicht, da es beim automatischen Generieren von JSON- oder XML-Antworten Probleme verursacht.
0
Vimalesh Valiya