2015-03-19 11 views
25

Sto cercando di creare un servizio Web Restful navigando in giro la rete e ho creato uno, ma sto ottenendo un MessageBodyWriter non trovato per errore tipo di supporto = application/jsonSEVERE: MessageBodyWriter non trovato per il tipo di supporto = application/json, type = class com.jersey.jaxb.Todo, genericType = class com.jersey.jaxb.Todo

mio Todo classe:

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 il mio Resource: -

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

} 

mio 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> 

mio 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 eseguire questo: http://localhost:8080/MyFirstWebService/rest/todo

ottengo l'errore:

SEVERE: MessageBodyWriter not found for media type=application/json, type=class com.jersey.jaxb.Todo, genericType=class com.jersey.jaxb.Todo.

risposta

42

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

Ma ...

quell'artefatto è ancora dipendente Jacskon stessa, che comprende tutti questi manufatti

enter image description here

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

Poi basta aggiungere il pacchetto al web.xml, e dovrebbe funzionare

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

1. Maven dipendenza

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

Oppure utilizzare il seguito Jersey "wrapper" per la dipendenza 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 il supporto per Entity Data Filtering.

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

Nota: Il fatto che non abbiamo per registrare qualsiasi cosa con la dipendenza di cui sopra, è reso possibile attraverso l'Auto-discovery feature di Jersey. Se per qualche ragione disabilitiamo l'auto-discovery, vorrai registrare esplicitamente lo JacksonFeature.

+0

non sono attualmente in uso Maven. Quindi dovresti scaricare tutti questi jar per primo e aggiungerlo alla mia applicazione e quindi aggiungere questa linea che hai menzionato sopra al mio web.xml. –

+0

Sì ............ –

+0

[Ecco la pagina di download] (http://wiki.fasterxml.com/JacksonDownload). Non avevo bisogno di usare l'ultimo file .jar elencato dallo screenshot. Ha funzionato per me! – amess

16

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

E aggiungere questa dipendenza sul tuo pom.xml:

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
</dependency> 
0
  1. aggiornamento della libreria JAX-RS 2.0 e Jersey 2.5.1 (JAX-RS-RI) solo
  2. oggetto Return Bean (todo) non risposta perché mentre genera automaticamente json o xml la risposta genera un problema.
3

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

+0

per coloro che usano lombok, come me, e stanno usando '' @ Builder'', sarà necessario aggiungere queste annotazioni: '' @ NoArgsConstructor'' '' @ AllArgsConstructor''. – Vielinko

4

Ho avuto lo stesso problema, ho risolto da addind un costruttore vuoto alla classe

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

public SandBoxClass(Integer arg1, Integer arg2) { 
     this.arg1=arg1; 
     this.arg2=arg2; 
} 
Problemi correlati