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()
{
}
}