Sto sperimentando combinando Jackson e Lombok. Queste sono le mie classi:
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);
}
}
Questi sono i JAR che sto aggiungendo alla classe:
Lombok: https://projectlombok.org/downloads/lombok.jar (versione 1.16.10)
Annotazioni Jackson: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar
Nucleo di Jackson: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.8.2/jackson-core-2.8.2.jar
Jackson databind: 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 sto compilando con Netbeans (non credo che questo sia realmente rilevante, ma lo riporto comunque per renderlo perfettamente e fedelmente riproducibile). I cinque JAR sopra sono conservati in una cartella chiamata " lib
" all'interno della cartella del progetto (insieme a " src
", " nbproject
" "," test
"e" build
"). Li ho aggiunti a Netbeans tramite il pulsante " Aggiungi JAR / Cartella " nelle proprietà del progetto e sono elencati nell'ordine esatto dell'elenco sopra. Il progetto è un progetto di tipo "applicazione Java" standard.
Inoltre, il progetto Netbeans è configurato per " NON compilare al salvataggio ", " generare informazioni di debug ", " segnalare API deprecate ", " tenere traccia delle dipendenze Java ", " processo di annotazione activacte " e " processo di annotazione activacte nell'editor ". Nessun processore di annotazioni o opzione di elaborazione delle annotazioni è esplicitamente configurato in Netbeans. Inoltre, " -Xlint:all
" l'opzione della riga di comando viene passata nella riga di comando del compilatore e il compilatore viene eseguito su una VM esterna.
La versione del mio javac è 1.8.0_72 e la versione del mio java è 1.8.0_72-b15. Il mio Netbeans è 8.1.
Il mio progetto si compila bene. Tuttavia, genera un'eccezione nella sua esecuzione. L'eccezione non sembra essere qualcosa che sembra facilmente o ovvio risolvibile. Ecco l'output, incluso lo 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
Ho già provato a colpire a caso con le annotazioni @Value
e @AllArgsConstructor
, ma non sono riuscito a migliorarlo.
Ho cercato su Google l'eccezione e ho trovato una vecchia segnalazione di bug su Jackson e un'altra aperta, ma sembra essere correlata a qualcos'altro . Tuttavia, questo ancora non dice nulla su cosa sia questo bug o su come risolverlo. Inoltre, non sono riuscito a trovare nulla di utile cercando che altrove.
Dal momento che quello che sto cercando di fare è un utilizzo molto basilare sia di lombok che di jackson, sembra strano che non sia riuscito a trovare ulteriori informazioni utili su come risolvere questo problema. Forse mi sono perso qualcosa?
Oltre a dire " non usare lombok " o " non usare jackson ", qualcuno ha idea di come risolverlo?