Eccezione Jersey: SEVERE: un body reader del messaggio per la class Java

Ho una Rest WS basata su Jersey che emette JSON. Sto implementando un client Jersey per invocare il WS e consumare la risposta JSON. Il codice cliente che ho è sotto

 WebResource r = restClient.resource (UriBuilder.fromUri ("http: // localhost /") .port (8080) .build ());
 String resp = r.path ("/ user"). Accept (MediaType.APPLICATION_JSON) .get (String.class);
 Utente [] users = r.path ("/ user"). Accept (MediaType.APPLICATION_JSON) .get (Utente []. Classe);

La seconda riga restituisce correttamente la risposta stringa JSON, tuttavia la 3a riga per eseguire il marshalling JSON sul POJO non sta accadendo e ottengo la seguente eccezione di stacktrace

 SEVERE: un messaggio body reader per la class Java [Lorg.shoppingsite.model.entity.jpa.User ;, e class di tipi Java [Lorg.shoppingsite.model.entity.jpa.User ;, e tipo di media MIME application / json non era trovato
 21 dic 2011 11:32:01 com.sun.jersey.api.client.ClientResponse getEntity
 SEVERE: I lettori del corpo del messaggio registrati compatibili con il tipo di supporto MIME sono:
 * / * ->
   com.sun.jersey.core.impl.provider.entity.FormProvider
   com.sun.jersey.core.impl.provider.entity.StringProvider
   com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
   com.sun.jersey.core.impl.provider.entity.FileProvider
   com.sun.jersey.core.impl.provider.entity.InputStreamProvider
   com.sun.jersey.core.impl.provider.entity.DataSourceProvider
   com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider $ Generale
   com.sun.jersey.core.impl.provider.entity.ReaderProvider
   com.sun.jersey.core.impl.provider.entity.DocumentProvider
   com.sun.jersey.core.impl.provider.entity.SourceProvider $ StreamSourceReader
   com.sun.jersey.core.impl.provider.entity.SourceProvider $ SAXSourceReader
   com.sun.jersey.core.impl.provider.entity.SourceProvider $ DOMSourceReader
   com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider $ Generale
   com.sun.jersey.core.impl.provider.entity.XMLListElementProvider $ Generale
   com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider $ Generale
   com.sun.jersey.core.impl.provider.entity.EntityHolderReader

Ho i MIME TYPE corretti nella mia richiesta. Il mio POJO è stato annotato con XMLRootElement. Cosa mi manca

Grazie

Sono stato in grado di risolvere il problema aggiungendo la dipendenza Maven per jersey-json.

Per farlo funzionare hai solo bisogno di due cose. Controlla se ti manca:

  1. Prima di tutto, hai bisogno dell’annotazione @XmlRootElement per la tua class object / entity framework.
  2. Devi aggiungere dipendenza per jersey-json se ti manca. Per il tuo riferimento ho aggiunto questa dipendenza al mio pom.xml.

     com.sun.jersey jersey-json 1.17.1  

So che questo post è vecchio e l’hai capito molto tempo fa, ma solo per salvare le persone che leggeranno questo tempo.

Probabilmente hai dimenticato di aggiungere annotazioni all’entity framework che stai passando all’endpoint, quindi Jersey non sa come elaborare il POJO che riceve. Annota il pojo con qualcosa del genere:

 @XmlRootElement(name = "someName") 

Se stai costruendo un uberjar o un “jar ombreggiato”, assicurati che i tuoi file di servizio meta inf vengano uniti. (Questo mi ha morso più volte su un progetto dropwizard.)

Se stai usando il plugin gradle shadowJar, vuoi chiamare mergeServiceFiles() nella tua destinazione shadowJar : https://github.com/johnrengelman/shadow#merging-service-files

Non sei sicuro di quali siano i comandi analoghi per esperti o altri sistemi di generazione.

metti questo

   com.sun.jersey.api.json.POJOMappingFeature true  

Abbiamo anche deciso di utilizzare la maglia come soluzione. Ma siccome stiamo usando org.JSON nella maggior parte dei casi questa dipendenza non è necessaria e non ci sentiamo bene.

Quindi abbiamo usato la rappresentazione String per ottenere un object org.JSON, invece di

 JSONObject output = response.getEntity(JSONObject.class); 

lo usiamo in questo modo ora:

 JSONObject output = new JSONObject(response.getEntity(String.class)); 

dove JSONObject proviene da org.JSON e le importazioni possono essere cambiate da:

 -import org.codehaus.jettison.json.JSONArray; -import org.codehaus.jettison.json.JSONException; -import org.codehaus.jettison.json.JSONObject; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; 

Aggiungi le linee sottostanti nel POJO prima dell’inizio della lezione e il problema è risolto. @Produces (“application / json”) @XmlRootElement Vedere l’esempio import javax.ws.rs.Produces; import javax.xml.bind.annotation.XmlRootElement;

  /** * @author manoj.kumar * @email [email protected] */ @Produces("application/json") @XmlRootElement public class User { private String username; private String password; private String email; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } add below lines inside of your web.xml  com.sun.jersey.api.json.POJOMappingFeature true  Now recompile your webservice everything would work!!! 

Nel mio caso, sto usando POJO. E ho dimenticato di configurare POJOMappingFeature come vero. Maycon lo ha indicato in una risposta anticipata. Tuttavia alcuni ragazzi potrebbero avere problemi a configurarlo correttamente in web.xml, ecco il mio esempio.

  Jersey Servlet com.sun.jersey.spi.spring.container.servlet.SpringServlet  com.sun.jersey.api.json.POJOMappingFeature true  1  

Prova ad aggiungere:

  com.owlike genson 1.4  

Anche questo problema può verificarsi se stai utilizzando HTTP GET con il corpo del messaggio, quindi in questo caso l’aggiunta di jersey json lib, @XmlRootElement o la modifica di web.xml non saranno di aiuto. Dovresti utilizzare l’URL QueryParam o HTTP POST .

È necessario implementare il proprio MessageBodyReader e MessageBodyWriter per la propria class Lorg.shoppingsite.model.entity.jpa.User .

 package javax.ws.rs.ext; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; public interface MessageBodyReader { public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType); public T readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException; } package javax.ws.rs.ext; import java.io.IOException; import java.io.OutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; public interface MessageBodyWriter { public boolean isWriteable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType); public long getSize(T t, Class type, Type genericType, Annotation[] annotations, MediaType mediaType); public void writeTo(T t, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException; } 

Basta controllare se si stanno eseguendo istanze diverse in eclipse. Ho lasciato tutte le altre sessioni, la build pulita ha risolto il problema

Alcuni potrebbero essere confusi perché aggiungere jersey json jar non può risolvere questo problema. Ho scoperto che questo jar deve essere più recente di jersey-json-1.7.jar (1.7.0 non funziona, ma 1.7.1 funziona correttamente). spero che questo possa aiutare

La mia era una situazione simile. Ricevo questo errore in momentjs cruciali e non ricordo come l’avevo risolto prima, cosa che ho fatto molte volte. Dopo ore faticose di ispezione, ho risolto e riprodotto l’errore e assicurato quanto sia semplice la soluzione per questa situazione.

Okay – soluzione: rimuovere ( o correggere ) qualsiasi modifica appena apportata ai file delle proprietà del progetto principale.

Sì, è così. In effetti, il mio progetto è un enorme multi-modulato, e sai che andare senza dipendenze corrette è uno scenario raro come viene spesso scaricato da git (anche RAC). Il mio progetto stava ottenendo quasi tutte le cose configurabili da un file di proprietà che è comune a circa 15 moduli (sottoprogetti) con una buona quantità di interdipendenze tra di loro. La dipendenza di jersey-json è sempre presente nel mio genitore fuso. Le annotazioni XML non rappresentano un problema poiché il progetto viene eseguito per circa 100 volte dopo la loro modifica. alcune soluzioni qui puntano a web.xml e cose come POJOMappingFeature. Nel mio caso, non ho nemmeno toccato il modulo webapp in questa build. comunque, questa soluzione ha funzionato per me e sto passando del tempo per registrare questo in SO nel caso in cui, se mai dovessi cadere in questo errore, non dovrei sprecare le mie notti addormentate. (certo, anche per te)