services restful example ejemplo consume java json web-services rest jax-rs

java - restful - Obteniendo "MessageBodyWriter not found for media type=application/json" tratando de enviar objetos JSON a través del servicio web JAX-RS



web service rest java eclipse (7)

Así es como resolví el problema.

Utiliza Jackson. Agregó estos frascos

Agregué esta clase a mi proyecto. Las líneas clave del código están marcadas como IMPORTANTE.

import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; <-- IMPORTANT import java.util.HashSet; import java.util.Set; import javax.ws.rs.core.Application; //@javax.ws.rs.ApplicationPath("webresources") public class MyApplicationConfig extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new java.util.HashSet<Class<?>>(); //addRestResourceClasses(resources); //resources.add(MultiPartFeature.class); //resources.add(JettisonFeature.class); return resources; } @Override public Set<Object> getSingletons() { final Set<Object> instances = new HashSet<Object>(); instances.add(new JacksonJsonProvider()); <--------- IMPORTANT return instances; } /** * Do not modify addRestResourceClasses() method. * It is automatically populated with * all resources defined in the project. * If required, comment out calling this method in getClasses(). */ private void addRestResourceClasses(Set<Class<?>> resources) { //resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class); //resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class); } }

Estoy tratando de enviar un objeto JSON a través de un servicio web JAX-RS. Mi archivo web.xml es:

<servlet> <description>JAX-RS Tools Generated - Do not modify</description> <servlet-name>JAX-RS Servlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>it.notifire</param-value> </init-param> <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> <servlet-mapping> <servlet-name>JAX-RS Servlet</servlet-name> <url-pattern>/jaxrs/*</url-pattern> </servlet-mapping>

La clase que modela el objeto que deseo enviar es:

public class GPSCoordinate { private float latitudine; private float longitudine; public float getLatitudine() { return latitudine; } public void setLatitudine(float latitudine) { this.latitudine = latitudine; } public float getLongitudine() { return longitudine; } public void setLongitudine(float longitudine) { this.longitudine = longitudine; } }

El recurso de la clase raíz es:

@Path("position") public class Position { @Context private UriInfo context; @GET @Produces(MediaType.APPLICATION_JSON) public GPSCoordinate getHTML() { GPSCoordinate coord = new GPSCoordinate(); coord.setLatitudine(90.45f); coord.setLongitudine(34.56f); return coord; } }

Ahora, cuando intento acceder al servicio, señalo mi navegador al siguiente enlace

http://localhost:8080/Notifire/jaxrs/position

y recibo el siguiente error:

message org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter no se encuentra para media type = application / json

En mi carpeta WEB-INF / lib tengo el último lanzamiento de la implementación jersey JAX-RS (jaxrs-ri-2.5.jar) y el archivo jersey-json.jar.

Cualquier ayuda sería muy apreciada.


Intenta agregar Genson a su ruta de clases, automáticamente habilitará el soporte de JSON.

Genson es una biblioteca de enlace y enlace de datos para json y java / scala. Implementa los puntos de extensión MessageBodyReader / Writer de JAX-RS, lo que permite a jersey detectar automáticamente Genson y usarlo para el análisis / escritura de Json.

Puede encontrar más información sobre la integración de Gensons con JaxRS (jersey & cie).


Jersey admite las características ''autodescubribles'' y el soporte JSON es uno de ellos. Para habilitarlo, debe agregar una biblioteca compatible a su ruta, de acuerdo con los documentos

Sin embargo, aunque la biblioteca recomendada jersey-media-json-processing no ha sido reconocida en mi caso por alguna razón, jersey-media-moxy tiene:

<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-moxy</artifactId> <version>2.15</version> </dependency>

2.15 ha sido la última versión en el momento de la escritura. Visite la página de artefactos centrales de Maven para encontrar la versión actual.


Me funcionó al agregar todos los Jotas de Jackson necesarios. Agregó estos frascos

  • jackson-annotations-2.8.7.jar,
  • jackson-core-2.8.7.jar
  • jackson-databind-2.8.7.jar
  • jackson-jaxrs-base-2.8.7.jar
  • jackson-jaxrs-json-provider-2.8.3.jar
  • jackson-module-jaxb-annotations-2.8.7.jar

Mi causa raíz fue ligeramente diferente. Pasé algún tiempo depurando el código fuente de Jersey, y resultó que no se puede construir un JAXBContext debido a que falta el constructor predeterminado en mi clase JAXB. Sucede durante la búsqueda de un MessageBodyWriter adecuado, pero la excepción no se maneja.

Aquí está el fragmento de código correspondiente (MOXyJsonProvider: 324):

try { Set<Class<?>> domainClasses = getDomainClasses(genericType); return getJAXBContext(domainClasses, annotations, mediaType, null); } catch(JAXBException e) { return null; }

Entonces, si tiene la dependencia de Moxy JSON en POM, verifique que sus clases de JAXB sean válidas.

Versiones que estoy usando: Jersey 2.19, Moxy 2.6.0.


Registre la clase JacksonJsonProvier con la configuración del cliente y luego cree el objeto Client, esto funcionó para mí. A continuación está el código.

ClientConfig config = new ClientConfig(); config.register(JacksonJsonProvider.class); Client client = ClientBuilder.newClient(config);