restful example consume java json rest jersey

example - Excepción de Jersey: SEVERE: un lector de cuerpo de mensaje para la clase de Java



restful java (13)

Algunos pueden confundirse por qué añadir jersey-json jar no puede resolver este problema. Descubrí que este jar tiene un formato más nuevo que jersey-json-1.7.jar (1.7.0 no funciona, pero 1.7.1 funciona bien). espero que esto pueda ayudar

Tengo un Rest WS basado en Jersey que produce JSON. Estoy implementando un Jersey Client para invocar el WS y consumir la respuesta JSON. El código de cliente que tengo está debajo

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

La 2ª línea genera la cadena JSON correctamente, sin embargo, la 3ª línea para ordenar JSON al POJO no está pasando y obtengo la siguiente excepción stacktrace

SEVERE: A message body reader for Java class [Lorg.shoppingsite.model.entity.jpa.User;, and Java type class [Lorg.shoppingsite.model.entity.jpa.User;, and MIME media type application/json was not found Dec 21, 2011 11:32:01 AM com.sun.jersey.api.client.ClientResponse getEntity SEVERE: The registered message body readers compatible with the MIME media type are: */* -> 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$General 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$General com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General com.sun.jersey.core.impl.provider.entity.EntityHolderReader

Tengo los TIPOS MIME correctos en mi pedido. Mi POJO ha sido anotado con XMLRootElement. Qué me estoy perdiendo.

Gracias


El mío fue una situación similar. Recibo este error en momentos cruciales y no recuerdo cómo lo había resuelto antes, lo que hice muchas veces. Después de horas de inspección extenuantes, resolví y reproduje el error y me aseguré de cuán simple es la solución para esta situación.

De acuerdo, solución: elimine ( o corrija ) cualquier cambio realizado recientemente en los archivos de propiedades de su proyecto principal.

Si esto es. De hecho, mi proyecto es uno enorme con varios mods, y sabes que ir sin dependencias correctas es un caso raro que se obtiene a menudo de git (RAC también). Mi proyecto obtenía casi todas las cosas configurables de un archivo de propiedades que es común para aproximadamente 15 módulos (subproyectos) con buena cantidad de intra-dependencias entre ellos. La dependencia de jersey-json siempre está presente en mi pom padre combinado. Las anotaciones XML no son un problema ya que el proyecto se ejecuta alrededor de 100 veces después de modificarlas. algunas soluciones aquí apuntan a web.xml y cosas como POJOMappingFeature. En mi caso, ni siquiera he tocado el módulo webapp en esta compilación. así que, de todos modos, esta solución funcionó para mí y estoy pasando el tiempo para registrar esto en SO, en caso de que alguna vez caiga en este error, no tendría que perder mis noches de sueño. (por supuesto, para ti también)


En mi caso, estoy usando POJO. Y olvidé configurar POJOMappingFeature como verdadero. Maycon lo ha señalado en una respuesta temprana. Sin embargo, algunos chicos pueden tener problemas para configurarlo en web.xml correctamente, aquí está mi ejemplo.

<servlet> <servlet-name>Jersey Servlet</servlet-name> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> <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>


Necesita implementar su propio MessageBodyReader y MessageBodyWriter para su clase 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<T extends Object> { public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType); public T readFrom(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> 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<T extends Object> { 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<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException; }


Para que funcione, solo necesitas dos cosas. Verifica si te estás perdiendo:

  1. En primer lugar, necesita la anotación @XmlRootElement para su clase / entidad de objeto.
  2. Necesita agregar la dependencia de jersey-json si falta. Para su referencia agregué esta dependencia a mi pom.xml.

    <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.17.1</version> </dependency>


Prueba agregar:

<dependency> <groupId>com.owlike</groupId> <artifactId>genson</artifactId> <version>1.4</version> </dependency>

También este problema puede ocurrir si está utilizando HTTP GET con el cuerpo del mensaje, por lo que en este caso agregar jersey-json lib, @XmlRootElement o modificar web.xml no será de ayuda. Debe usar URL QueryParam o HTTP POST .


Pude solucionar el problema agregando la dependencia de maven para jersey-json.


Sé que esta publicación es antigua y descubriste esto hace mucho tiempo, pero solo para salvar a las personas que leerán esto en algún momento.

Probablemente haya olvidado agregar una anotación a la entidad que está pasando al punto final, por lo que Jersey no sabe cómo procesar el POJO que recibe. Anota al pojo con algo como esto:

@XmlRootElement(name = "someName")


Si está creando un archivo jar uberjar o "sombreado", asegúrese de que los archivos del servicio meta inf estén fusionados. (Esto me mordió varias veces en un proyecto dropwizard).

Si está utilizando el complemento gradle shadowJar, desea llamar a mergeServiceFiles() en su destino shadowJar : https://github.com/johnrengelman/shadow#merging-service-files

No estoy seguro de cuáles son los comandos análogos para maven u otros sistemas de compilación.


Simplemente verifica si estás ejecutando instancias diferentes en eclipse. Dejé todas mis otras sesiones, clean build corrigió el problema


Solo agregue las líneas a continuación en su POJO antes de comenzar la clase, y su problema se resuelve. @Produces ("application / json") @XmlRootElement Vea el ejemplo 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 <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> Now recompile your webservice everything would work!!!


También decidimos usar jersey como una solución. Pero como estamos usando org.JSON en la mayoría de los casos, esta dependencia es innecesaria y no nos sentimos bien.

Por lo tanto, utilizamos la representación de cadena para obtener un objeto org.JSON, en lugar de

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

lo usamos de esta manera ahora:

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

donde JSONObject proviene de org.JSON y las importaciones se pueden cambiar desde:

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


solo pon esto

<init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param>