jboss - traduccion - resteasy maven
Bucle de serializaciĆ³n JSON(recursiĆ³n infinita) en Wildfly (1)
La solución es crear una clase que implemente MessageBodyWriter<Object>
utilizando el ObjectMapper
de Jackson:
@Provider
@Produces("application/json")
public class JacksonMapper implements MessageBodyWriter<Object> {
@Override
public boolean isWriteable(Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
return true;
}
@Override
public long getSize(Object object, Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
return 0;
}
@Override
public void writeTo(Object object, Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> stringObjectMultivaluedMap, OutputStream outputStream)
throws IOException, WebApplicationException {
outputStream.write(new ObjectMapper().writeValueAsBytes(object));
}
}
No hay necesidad de ninguna exclusión o descripciones específicas de Wildfly.
No importa si incluye las dependencias o no (los ámbitos compile
o provided
funcionan bien) ya que Jackson 2 está incluido en Wildfly. Sin embargo, por una razón desconocida, es casi imposible desactivar Jackson 1.
Esta solución trae a Jackson 2 a las obras. Ahora puede evitar fácilmente los bucles de serialización usando la anotación @JsonIdentityInfo
. Más información aquí .
Estoy desarrollando una aplicación JavaEE sencilla basada en maven en IntelliJ IDEA, y obviamente me gustaría usar Wildfly 8 para desarrollo y producción. Simplemente necesito exponer algunas entidades a través de algunos servicios web RESTful. Esas entidades tienen relaciones bidireccionales, lo que conduce a un bucle cuando se serializarán en JSON.
Las versiones más nuevas de Jackson son capaces de manejar este tipo de situaciones con una anotación especial. Para que funcione, necesito excluir el serializador JSON integrado / proveedor de jackson / lo que sea y usar la versión más nueva que viene incluida con mi aplicación. He seguido las instrucciones que he encontrado en la web y se me ocurrió este archivo jboss-deployment-structure.xml:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.codehaus.jackson.jackson-jaxrs" />
<module name="org.codehaus.jackson.jackson-core-asl" />
<module name="org.codehaus.jackson.jackson-mapper-asl" />
<module name="org.codehaus.jackson.jackson-xc" />
</exclusions>
</deployment>
</jboss-deployment-structure>
El problema es que no funciona. Incluso cuando configuré mi pom.xml a algo como esto:
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.3.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>3.0.6.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
lo que indica claramente que nada debe venir incluido con mi aplicación, todavía obtengo este StackOverflowError (causado por el bucle infinito) que se origina en el paquete org.codehaus.jackson. Esto significa que la versión incorporada de Jackson todavía está en proceso y no está excluida. ¿Cómo puedo arreglar esto?
Gracias por adelantado.
ACTUALIZACIONES
Cambié el título porque creo que el problema es aún mayor. O estoy haciendo algo terriblemente mal o hay un problema serio con Wildfly.
Creé un pom.xml con todas las bibliotecas de jackson 2 (com.fasterxml.jackson *) con un alcance de "compilación". Las bibliotecas están incluidas en la carpeta WEB-INF / lib. Escribí un @Provider de acuerdo con las preguntas frecuentes de Jackson JAX-RS y puedo verificar que realmente lo lee la implementación de JAX-RS (RestEasy), simplemente porque la implementación falla si no incluyo las bibliotecas de jackson en WEB-INF / lib con una ClassNotFoundException. Sin embargo, todavía recibo infinitos errores de recursión con org.codehaus.X (Jackson 1).
No me importa cómo, solo necesito una solución para arreglar esta infinita recursión en Wildfly.