Saya sedang bereksperimen dalam menggabungkan Jackson dan Lombok. Itu adalah kelasku:
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);
}
}
Itu adalah JAR yang saya tambahkan ke classpth:
Lombok: https://projectlombok.org/downloads/lombok.jar (versi 1.16.10)
Anotasi Jackson: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar
Inti 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
Saya mengompilasinya dengan Netbeans (menurut saya ini tidak benar-benar relevan, tetapi saya tetap melaporkannya agar dapat direproduksi dengan sempurna dan setia). Lima JAR di atas disimpan dalam folder bernama " lib
" di dalam folder proyek (bersama dengan " src
", " nbproject
", " test
" dan " build
"). Saya menambahkannya ke Netbeans melalui tombol " Tambahkan JAR / Folder " di properti proyek dan mereka terdaftar dalam urutan yang tepat seperti daftar di atas. Proyek ini adalah proyek jenis "aplikasi Java" standar.
Lebih lanjut, proyek Netbeans dikonfigurasi untuk " JANGAN dikompilasi saat disimpan ", " buat info debugging ", " laporkan API yang tidak digunakan lagi ", " lacak ketergantungan java ", " aktifkan pemrosesan anotasi ", dan " aktifkan pemrosesan anotasi di editor ". Tidak ada pemroses anotasi atau opsi pemrosesan anotasi yang dikonfigurasi secara eksplisit di Netbeans. Selain itu, -Xlint:all
opsi baris perintah " " diteruskan di baris perintah kompilator, dan kompilator dijalankan pada VM eksternal.
Versi javac saya adalah 1.8.0_72 dan versi java saya adalah 1.8.0_72-b15. Netbeans saya adalah 8.1.
Proyek saya terkompilasi dengan baik. Namun, itu membuat pengecualian dalam eksekusinya. Pengecualian tampaknya tidak menjadi sesuatu yang terlihat mudah atau jelas dapat diperbaiki. Berikut adalah outputnya, termasuk 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
Saya sudah mencoba mencolek secara acak dengan anotasi @Value
dan @AllArgsConstructor
, tetapi saya tidak bisa membuatnya lebih baik.
Saya mencari pengecualian di Google dan menemukan laporan bug lama tentang jackson , dan satu lagi yang terbuka, tetapi tampaknya terkait dengan sesuatu yang lain . Namun, ini masih tidak memberi tahu apa-apa tentang bug ini atau bagaimana cara memperbaikinya. Juga, saya tidak dapat menemukan sesuatu yang berguna mencari itu di tempat lain.
Karena apa yang saya coba lakukan adalah penggunaan yang sangat mendasar dari lombok dan jackson, tampaknya aneh bahwa saya tidak dapat menemukan informasi yang lebih berguna tentang cara mengatasi masalah ini. Mungkin saya melewatkan sesuatu?
Selain hanya mengatakan " jangan gunakan lombok " atau " jangan gunakan jackson ", apakah ada yang tahu tentang cara mengatasinya?