eclipse - Jersey: no se encontrĂ³ un escritor de cuerpo de mensaje para Java class y MIME mediatype application/json
message (8)
Mover la dependencia de jersey-json
a la parte superior del pom.xml resolvió este problema para mí.
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.18.1</version>
</dependency>
<!-- other dependencies -->
</dependencies>
Después de tratar de descubrir cuál es mi problema, finalmente decidí preguntarte cómo resolver mi problema. He visto a diferentes personas con el mismo problema y probé todas las cosas que se les aconsejó hacer, pero nada ayudó con mi problema. Básicamente, tengo un servicio RESTful que construyo usando Jersey. Para mi cliente, me gustaría devolver un objeto en formato JSON. Leí diferentes tutoriales y decidí que tiene sentido usar la biblioteca jersey-json-1.8. Agregué todo a mi proyecto como de costumbre e intenté ejecutarlo, pero cada vez que llamo al servicio (a través de get request atm.) Obtengo el código de error HTTP 500 (error interno del servidor) y mi servidor responde que no hay ningún cuerpo del mensaje escritor podría ser encontrado. Si devuelvo XML funciona bien y todo es genial. También intenté copiar jersey-json-1.8.jar a mi carpeta de lib de Tomcat porque tenía que hacer esto con la lib de mysql que estoy usando, pero tampoco me ayudó. ¡Me alegraría mucho si pudieras ayudarme a hacer que esto funcione! Si necesita más información simplemente deje un comentario y lo proporcionaré tan rápido como sea humanamente posible :)
La configuración de mi proyecto es: 3 paquetes diferentes 1. Mis servicios RESTful 2. Mi trabajo Java donde manejo las conexiones SQL, etc. 3. Un paquete donde almaceno todos mis modelos con los que necesito trabajar y que quiero devolver en formato JSON ( en mi ejemplo una ruta para un testdrive)
Un Tomcat Webserver IDE: Eclipse estoy usando Maven
No importa qué o cómo estoy tratando de devolver el Objeto, simplemente no funcionará y recibo constantemente el mensaje de error:
Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.mykong.models.Teststrecke, and Java type class com.mykong.models.Teststrecke, and MIME media type application/json was not found
EDITAR: Este es mi método de servicio JSON
@Path("/hellojson")
public class JSONService {
@GET
@Produces(MediaType.APPLICATION_JSON)
public ArrayList<Route> getJSONMsg()
{
Route ts = new Route();
ts.setId(1);
ts.setName("HelloWorld");
Route ts2 = new Route();
ts2.setId(2);
ts2.setName("HelloWorld");
ArrayList<Route> availRoutes = new ArrayList<Route>();
availRoutes.add(ts);
availRoutes.add(ts2);
return availRoutes;
}
}
Verifique en Dependencias de Maven en el Explorador de paquetes, si no ve eso o jersey-bundle-1.8.jar, entonces probablemente haya especificado solo jersey-server. Cambie la dependencia en pom.xml a jersey-bundle y debería funcionar.
Jersey 2.4: Me enfrenté a este problema también y publicando esto en caso de que ayude a alguien. Tomé esto de la Especificación API de Jersey para la Integración JSON: ( https://jersey.java.net/documentation/latest/user-guide.html#json )
Utilicé Jettison para la integración con Jersey con JSON. Pero incluso después de agregar todas las bibliotecas obtuve el error: no se encontró un escritor de cuerpo de mensaje para Java Class y MIME mediatype application / json
Se trata de agregar las bibliotecas correctas y también registrar funciones> Agregué una biblioteca adicional además de todas las otras que proporciona Jersey: jersey-media-json-jettison-2.4.jar. Y agregó el siguiente código para registrar la función Jettison.
public class MyApplication extends ResourceConfig{
public MyApplication() {
register(JettisonFeature.class);
packages("org.XXX.XXX.XXX");
}
Eliminar @Produces (MediaType.APPLICATION_JSON); y use el archivo JSONLibraries.zip para convertir sus datos hacia y desde JSON. Está funcionando perfectamente. El problema con el código anterior es que está usando la combinación de maven y jackson. Por lo tanto, APPLICATION_JSON no se puede encontrar cuando solo está usando jersey. Trabajé con / desde material de conversión JSON, me dio el mismo error, lo intenté con esta solución y estaba funcionando correctamente.
Código:
@Path("/hellojson")
public class JSONService {
@GET
public ArrayList<Route> getJSONMsg()
{
Route ts = new Route();
ts.setId(1);
ts.setName("HelloWorld");
Route ts2 = new Route();
ts2.setId(2);
ts2.setName("HelloWorld");
ArrayList<Route> availRoutes = new ArrayList<Route>();
availRoutes.add(ts);
availRoutes.add(ts2);
return JSONObject.fromObject(availRoutes.toString()));
}
}
Agregar la dependencia a continuación resolvió mi problema. Según @eugen, traté de agregar la dependencia de Genson
que me ayudó a deshacerme de la excepción, aunque mi servidor arrojaba 400 solicitudes erróneas por algún motivo. Parece que Genson
no pudo transmitir la solicitud json correctamente. Pero debajo de la dependencia funcionó bien. Espero que ayude a otros ya que este problema me estaba volviendo loco.
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.3.0</version>
</dependency>
Incluya estas dependencias en su POM.xml y ejecute Maven -> Update
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.99</version>
</dependency>
Intente agregar la biblioteca Genson a su classpath http://owlike.github.io/genson/ . Es una api json <> java de transmisión y enlace de datos. Se integra bien con Jersey, para que funcionen necesitas 0 configuración. Jersey detecta que la biblioteca está en su classpath y habilita el mapeo json delegando a Genson.
Esta pregunta fue hecha hace un tiempo, pero para aquellos que leen, tenga en cuenta que el contenedor de servlet de jersey tiene su propio mapeador POJO.
Habilítelo agregando lo siguiente a su web.xml
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Observé algunas discrepancias en la forma en que mapean jersey y genson. Por ejemplo, si una clase tiene un campo de tipo A que está configurado para una instancia de B, que se extiende A, genson no serializará correctamente B, mientras que jersey sí.