SEVERE: MessageBodyWriter non trovato per il tipo di supporto = application / json, type = class com.jersey.jaxb.Todo, genericType = class com.jersey.jaxb.Todo

Sto cercando di creare un servizio web RESTful e ne ho creato uno, ma sto ottenendo un

MessageBodyWriter non trovato per tipo di supporto = errore applicazione / json

La mia class Todo :

 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); } } } 

E la mia risorsa: –

 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(); } } 

Il mio web.xml:

    index.html index.htm index.jsp default.html default.htm default.jsp  MyFirstWebService  Jersey REST Service org.glassfish.jersey.servlet.ServletContainer  jersey.config.server.provider.packages com.jersey.jaxb  1   Jersey REST Service /rest/*   

Le mie biblioteche:

 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 

Quando eseguo questa applicazione sul server Tomcat ed eseguo questo: http: // localhost: 8080 / MyFirstWebService / rest / todo

Ottengo l’errore:

SEVERE: MessageBodyWriter non trovato per il tipo di supporto = application / json, type = class com.jersey.jaxb.Todo, genericType = class com.jersey.jaxb.Todo.

Hai jackson-jaxrs-json-provider che è un inizio ..

Ma…

quell’artefatto dipende ancora da Jacskon stesso, che include tutti questi artefatti

inserisci la descrizione dell'immagine qui

Ecco perché usiamo Maven [ 1 ] (quindi non dobbiamo preoccuparci di questo genere di cose :-). Quindi vai a cercarli.

Quindi aggiungi il pacchetto al web.xml e dovrebbe funzionare

 jersey.config.server.provider.packages  com.jersey.jaxb, com.fasterxml.jackson.jaxrs.json  

1. Dipendenza da Maven

  com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider 2.2.3  

O utilizzare il “wrapper” di Jersey qui sotto per la dipendenza di cui sopra. Registrerà i provider di Jackson (quindi non abbiamo bisogno di registrarsi esplicitamente come sopra), e i mappatori delle eccezioni di Jackson, e partirà dalla versione 2.17, fornisce supporto per il filtraggio dei dati delle quadro .

  org.glassfish.jersey.media jersey-media-json-jackson ${jersey2.version}  

Nota: il fatto che non dobbiamo registrare nulla con la dipendenza di cui sopra, è reso ansible attraverso la funzione Auto-discovery di Jersey. Se per qualche ragione disabilitiamo l’auto-discovery, vorrai registrare esplicitamente la JacksonFeature .

La soluzione potrebbe essere quella di assicurarsi che le classi del modello abbiano un costruttore senza argomenti.

E aggiungi questa dipendenza al tuo pom.XML:

  org.glassfish.jersey.media jersey-media-moxy  

Ho avuto lo stesso problema, l’ho risolto aggiungendo un costruttore vuoto alla class

 public SandBoxClass(){} //-> solved the issue** public SandBoxClass(Integer arg1, Integer arg2) { this.arg1=arg1; this.arg2=arg2; } 

Se hai già aggiunto la dipendenza jersey-media-moxy nel tuo pom.xml. Assicurati che la tua class di quadro abbia il costruttore predefinito. Ho riscontrato questo problema quando ho introdotto un costruttore paramatrato nella class del modello. L’aggiunta del costruttore predefinito ha funzionato ancora per me.

  1. Aggiorna solo la libreria Jax-RS 2.0 e Jersey 2.5.1 (JAX-RS-RI)
  2. Restituisce object Bean (todo) non risposta perché mentre genera automaticamente json o xml la risposta genera un problema.