java - invaliddefinitionexception - objectmapper add custom deserializer
El constructor Jackson ObjectMapper() lanza NoSuchMethod (9)
El truco aquí es excluir a Jackson de las dependencias que lo utilizan.
Para verificar qué dependencias lo importan, puede usar el siguiente comando maven:
mvn dependency:tree -Dincludes=org.codehaus.jackson
Estoy usando el código de muestra de Jackson para deserializar un POJO:
ObjectMapper m = new ObjectMapper();
Esta línea lanza un NoSuchMethodError:
Exception in thread "main" java.lang.NoSuchMethodError: org.codehaus.jackson.type.JavaType.<init>(Ljava/lang/Class;)V
at org.codehaus.jackson.map.type.TypeBase.<init>(TypeBase.java:15)
at org.codehaus.jackson.map.type.SimpleType.<init>(SimpleType.java:45)
at org.codehaus.jackson.map.type.SimpleType.<init>(SimpleType.java:40)
at org.codehaus.jackson.map.type.TypeBindings.<clinit>(TypeBindings.java:18)
at org.codehaus.jackson.map.type.TypeFactory._fromType(TypeFactory.java:525)
at org.codehaus.jackson.map.type.TypeFactory.type(TypeFactory.java:61)
at org.codehaus.jackson.map.ObjectMapper.<clinit>(ObjectMapper.java:179)
at com.me.util.ctrl.BillingJobStatus.fromJson(BillingJobStatus.java:37)
No lo entiendo
En mi caso se debió a la biblioteca yammer-metrics que incluía una versión anterior de jackson.
<dependency>
<groupId>com.yammer.metrics</groupId>
<artifactId>metrics-servlet</artifactId>
<version>2.1.2</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
</exclusion>
</exclusions>
</dependency>
En mi caso, fue el sdk amazonaws que causó esto. Usar solo la exclusión para jackson-mapper-asl no funcionó, pero usar una exclusión para core y mapper sí:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.3.13</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
</exclusion>
</exclusions>
</dependency>
Es debido a que @RequestBody usa diferentes frascos para diferentes versiones de resortes: si usa el resorte 4 entonces tiene que agregar diferentes frascos:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>
Si usas el muelle 3 tienes que usar este frasco:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.5.0</version>
</dependency>
He enfrentado este problema al migrar mi aplicación web de Tomcat 6 a Tomcat 8. En Tomcat6 y Tomcat7, mi aplicación web empezaría bien, pero en Tomcat8 obtendría esta excepción (parece que T6 y T7 cargan las clases alfabéticamente pero T8 no lo hace) https://.com/a/26642798/1864614 ).
El problema era que estaba teniendo 2 versiones de la clase.
org.codehaus.jackson.map.ObjectMapper Respondido por @wild_nothing, he comprobado la dependencia del árbol para enumerar todas las dependencias en org.codehaus.jackson
En mi caso, el problema era que tenía varias versiones de bibliotecas que proporcionaban esta clase:
- org.codehaus.jackson: jackson-mapper-lgpl: jar: 1.5.0
- org.codehaus.jackson: jackson-core-lgpl: jar: 1.5.0
- org.codehaus.jackson: jackson-mapper-asl: jar: 1.8.2
- org.codehaus.jackson: jackson-core-asl: jar: 1.8.2
Mi solución fue excluir las versiones anteriores (1.5.0) y solo dejar la versión 1.8.2.
<dependency>
<groupId>cfm.foo</groupId>
<artifactId>jive</artifactId>
<exclusions>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-lgpl</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-lgpl</artifactId>
</exclusion>
</exclusions>
</dependency>
- En este caso, Jive dependía de la versión 1.5.0 más antigua.
Mientras trabajaba en Hadoop, eliminé este error estableciendo las siguientes exclusiones
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.0.1</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
</exclusion>
</exclusions>
</dependency>
Sí, cualquiera que se enfrente a este problema, debería investigar definitivamente las dependencias con
mvn dependency:tree -Dincludes=org.codehaus.jackson
En mi caso, tuve una dependencia de jackson en Atmosphere-Socket-io:
<dependency>
<groupId>org.atmosphere</groupId>
<artifactId>atmosphere-socketio</artifactId>
<version>2.2.1</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-lgpl</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-lgpl</artifactId>
</exclusion>
</exclusions>
</dependency>
Me tomó varias horas rastrear eso, ¡gracias a todos por las soluciones anteriores que me inspiraron! ¡Sigan con el buen trabajo!
Supongo que tus JAR de Jackson no están sincronizados. La clase JavaType
está en el JAR jackson-core
, y la clase ObjectMapper
está en jackson-mapper
.
Asegúrate de que ambos sean de la misma versión.
Yo tuve el mísmo problema. El tarro principal era 1.7.1 mientras que el mapeador era 1.8.1. Nota: para solucionar este problema, agregué una exclusión y bajé la versión correcta.
<exclusions>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
</exclusion>
</exclusions>