serialize invaliddefinitionexception exc deserializer deserialize databind custom caused cannot java json jackson nosuchmethoderror

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>