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);
Vaya a https://jersey.java.net/documentation/2.5.1/user-guide.html#json
Necesita completar su clase ... JAXB necesita eso, por ejemplo:
@XmlRootElement
public class MyJaxbBean {
@XmlElement(name="king")
public String name;
@XmlTransient
public int age;
// several lines removed
}