util type not messagebodywriter messagebodyreader found for application java rest jersey jax-rs

java - messagebodywriter - messagebodyreader not found for media type application json



MessageBodyWriter no encontrado para el tipo de medio=application/json (9)

Estoy enfrentando problemas al consumir servicios JAX-RS como JSON.

A continuación he agregado mi código.

Esta es mi clase de servicio:

//Sets the path to base URL + /hello @Path("/hello") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public class Hello { @GET @Produces("application/json") public Student getStudent() { Student s = new Student(); s.first_name = "Test First Name !!!"; s.last_name = "Test Last Name!!!"; return s; }

Clase de Student que estoy tratando de obtener del servicio:

@XmlRootElement public class Student implements Serializable { public String first_name; public String last_name; public String getFirst_name() { return first_name; } public void setFirst_name(String first_name) { this.first_name = first_name; } public String getLast_name() { return last_name; } public void setLast_name(String last_name) { this.last_name = last_name; } public Student() { first_name = "Fahad"; last_name = "Mullaji"; } }

Web XML en el lado del servicio.

<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>com.vogella.jersey.first</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <!-- Register resources and providers under com.vogella.jersey.first package. --> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.vogella.jersey.first</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>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>

No sé cómo solucionar este problema. Estoy usando SOAP UI para probar la respuesta JSON, pero supongo que no debería importar.

En muchos lugares que leo, necesito agregar el siguiente código. Pero no se donde. No estoy usando Maven para construir.

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

El servidor está buscando una función para analizar Student objeto Student a JSON pero no puede encontrar la función o el archivo jar para él. He agregado el frasco de Genson, Moxy, RESTEasy y Jackson, pero creo que ese es el problema. Creo que me falta el mapeo en alguna parte.


Bueno, no pude hacer que el proyecto web anterior funcionara. Pero seguí investigando sobre JAX-RS y encontré el tutorial de Stormpath. Creo que todo el que intente aprender cómo trabajan juntos REST, JSON y Jersey debería ver esto.

Vea los enlaces a continuación para su presentación y muestree el proyecto REST en GitHub.

https://www.youtube.com/watch?v=sVvL12BnIyQ

https://github.com/stormpath/todos-jersey

Ahora puedo comparar el proyecto anterior y ver qué hice mal.


Creo que deberías tratar de convertir los datos a formato json. Se puede hacer usando gson lib. Pruebe algo como a continuación.

No sé si son las mejores soluciones o no, pero podrías hacerlo de esta manera. Funcionó para mí

ejemplo: `

@GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public Response info(@HeaderParam("Accept") String accept) { Info information = new Info(); information.setInfo("Calc Application Info"); System.out.println(accept); if (!accept.equals(MediaType.APPLICATION_JSON)) { return Response.status(Status.ACCEPTED).entity(information).build(); } else { Gson jsonConverter = new GsonBuilder().create(); return Response.status(Status.ACCEPTED).entity(jsonConverter.toJson(information)).build(); } }


Debajo debería estar en su pom.xml sobre otras dependencias de jersy / jackson. En mi caso, como debajo de dep-cy de jersy-client y recibí MessageBodyWriter no encontrado para media type = application / json.

<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.25</version> </dependency>


Descommentar el siguiente código ayudó

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

que estaba presente en pom.xml en mi proyecto basado en maven resolvió este error para mí.


Enfrenté un problema similar porque el constructor de este objeto estaba usando parámetros

antes de

public MakeMoneyAndGetFitWhileYouSleep(@NotNull UserDetails turkey) {...}

Después

public MakeMoneyAndGetFitWhileYouSleep(){} public static MakeMoneyAndGetFitWhileYouSleep getInstance (@NotNull UserDetails turkey) {...}


Estaba en la misma situación donde
- No estaba usando Maven o Ant,
- Terminé vogella.com/tutorials/REST/article.html ,
- y MessageBodyWriter error MessageBodyWriter al intentar usar @Produces(MediaType.APPLICATION_JSON) .

Esta respuesta de @peeskillet resuelve el problema: debe usar los archivos Jackson * .jar que están disponibles en la página de descarga de FasterXML Jackson . Necesitarás los archivos core así como los archivos jaxrs .

Los agregué a mi WebContent/WEB-INF/lib donde tengo mis archivos Jersey * .jar según el tutorial anterior, y realicé el pequeño cambio al archivo web.xml a continuación (una vez más, como lo compartió originalmente @peeskillet):

<param-name>jersey.config.server.provider.packages</param-name> <param-value> your.other.package.here, com.fasterxml.jackson.jaxrs.json </param-value>

La parte más importante es com.fasterxml.jackson.jaxrs.json .


Para superar este problema, intente lo siguiente. Trabajó para mi.

Agregue la siguiente dependencia en el pom.xml

<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.25</version> </dependency>

Y asegúrese de que la clase Model no contenga ningún constructor arg

public Student() { }


Pude arreglarlo instalando jersey-media-json-jackson

Agregue la dependencia a pom.xml

<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <scope>runtime</scope> </dependency>


Tienes que crear un constructor vacío porque JAX-RS inicializa las clases ... Tu constructor no debe tener argumentos:

@XmlRootElement public class Student implements Serializable { public String first_name; public String last_name; public String getFirst_name() { return first_name; } public void setFirst_name(String first_name) { this.first_name = first_name; } public String getLast_name() { return last_name; } public void setLast_name(String last_name) { this.last_name = last_name; } public Student() { first_name = "Fahad"; last_name = "Mullaji"; } public Student() { } }