Estoy experimentando combinando Jackson y Lombok. Esas son mis clases:
package testelombok;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Value;
import lombok.experimental.Wither;
@Value
@Wither
@AllArgsConstructor(onConstructor=@__(@JsonCreator))
public class TestFoo {
@JsonProperty("xoom")
private String x;
private int z;
}
package testelombok;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xebia.jacksonlombok.JacksonLombokAnnotationIntrospector;
import java.io.IOException;
public class TestLombok {
public static void main(String[] args) throws IOException {
TestFoo tf = new TestFoo("a", 5);
System.out.println(tf.withX("b"));
ObjectMapper om = new ObjectMapper().setAnnotationIntrospector(new JacksonLombokAnnotationIntrospector());
System.out.println(om.writeValueAsString(tf));
TestFoo tf2 = om.readValue(om.writeValueAsString(tf), TestFoo.class);
System.out.println(tf2);
}
}
Esos son los archivos JAR que estoy agregando a la clase:
Lombok: https://projectlombok.org/downloads/lombok.jar (versión 1.16.10)
Anotaciones de Jackson: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar
Núcleo de Jackson: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.8.2/jackson-core-2.8.2.jar
Enlace de datos de Jackson: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.8.2/jackson-databind-2.8.2.jar
Jackson-lombok: http://repo1.maven.org/maven2/io/paradoxical/jackson-lombok/1.1/jackson-lombok-1.1.jar
Lo estoy compilando con Netbeans (no creo que esto sea realmente relevante, pero lo estoy informando de todos modos para que sea perfecta y fielmente reproducible). Los cinco JAR anteriores se guardan en una carpeta llamada " lib
" dentro de la carpeta del proyecto (junto con " src
", " nbproject
", " test
" y " build
"). Los agregué a Netbeans a través del botón " Agregar JAR / Carpeta " en las propiedades del proyecto y se enumeran en el orden exacto en la lista anterior. El proyecto es un proyecto de tipo "aplicación Java" estándar.
Además, el proyecto Netbeans está configurado para " NO compilar al guardar ", " generar información de depuración ", " informar API obsoletas ", " rastrear dependencias java ", " procesar anotaciones activacte " y " procesar anotaciones activacte en el editor ". No se configura explícitamente ningún procesador de anotaciones ni opción de procesamiento de anotaciones en Netbeans. Además, la -Xlint:all
opción de línea de " " comandos se pasa en la línea de comandos del compilador y el compilador se ejecuta en una máquina virtual externa.
La versión de mi javac es 1.8.0_72 y la versión de mi java es 1.8.0_72-b15. Mi Netbeans es 8.1.
Mi proyecto se compila bien. Sin embargo, arroja una excepción en su ejecución. La excepción no parece ser nada que parezca fácil o obviamente reparable. Aquí está la salida, incluido el stacktrace:
TestFoo(x=b, z=5)
{"z":5,"xoom":"a"}
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator
at [Source: {"z":5,"xoom":"a"}; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:296)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:269)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:475)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3890)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3785)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833)
at testelombok.TestLombok.main(TestLombok.java:14)
Caused by: java.lang.IllegalArgumentException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addDeserializerConstructors(BasicDeserializerFactory.java:511)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:323)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:253)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:219)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:141)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:406)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
... 7 more
Ya intenté pinchar aleatoriamente con las anotaciones @Value
y @AllArgsConstructor
, pero no pude hacerlo mejor.
Busqué en Google la excepción y encontré un informe de error antiguo en Jackson , y otro que está abierto, pero parece estar relacionado con otra cosa . Sin embargo, esto todavía no dice nada sobre qué es este error o cómo solucionarlo. Además, no pude encontrar nada útil buscando eso en otro lado.
Dado que lo que estoy tratando de hacer es un uso muy básico tanto de lombok como de jackson, parece extraño que no haya podido encontrar más información útil sobre cómo solucionar este problema. ¿Quizás me perdí algo?
Aparte de simplemente decir " no use lombok " o " no use jackson ", ¿alguien tiene alguna idea sobre cómo resolver esto?