Jackson ve Lombok'u birleştirmek için deneyler yapıyorum. Bunlar benim derslerim:
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);
}
}
Bunlar, sınıfa eklediğim JAR'lar:
Lombok: https://projectlombok.org/downloads/lombok.jar (sürüm 1.16.10)
Jackson notları: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar
Jackson çekirdeği: 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
Bunu Netbeans ile derliyorum (bunun gerçekten alakalı olduğunu düşünmüyorum, ancak bunu mükemmel ve aslına sadık bir şekilde yeniden üretilebilir hale getirmek için yine de bildiriyorum). Yukarıdaki beş JAR lib
, proje klasörünün içinde " " adlı bir klasörde tutulur (" src
", " nbproject
", " test
" ve " build
" ile birlikte). Bunları proje özelliklerinde " JAR / Klasör Ekle " butonu ile Netbeans'e ekledim ve yukarıdaki listede olduğu gibi tam sırayla listeleniyorlar. Proje, standart "Java uygulaması" tipi bir projedir.
Ayrıca, Netbeans projesi " kaydederken derleme YAPMAYIN ", " hata ayıklama bilgisi oluşturacak ", " kullanımdan kaldırılan API'leri bildirecek ", " java bağımlılıklarını takip edecek ", " activacte açıklama işlemi " ve " editörde " activacte açıklama işlemi " yapacak şekilde yapılandırılmıştır . Netbeans'te hiçbir açıklama işlemcisi veya açıklama işleme seçeneği açıkça yapılandırılmamıştır. Ayrıca, " -Xlint:all
" komut satırı seçeneği derleyici komut satırında iletilir ve derleyici harici bir VM'de çalışır.
Javac'ımın sürümü 1.8.0_72 ve java'mın sürümü 1.8.0_72-b15. Netbeans'ım 8.1.
Projem iyi derleniyor. Ancak, yürütülürken bir istisna atar. İstisna, kolayca görünen veya açıkça düzeltilebilen bir şey gibi görünmüyor. Yığın izleme dahil çıktı:
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
Zaten @Value
ve @AllArgsConstructor
ek açıklamalarla rastgele bir şekilde uğraşmayı denedim , ancak daha iyi hale getiremedim.
İstisnayı google'ladım ve jackson hakkında eski bir hata raporu buldum ve açık olan başka bir tane, ancak başka bir şeyle ilişkili görünüyor . Ancak, bu hala bu hatanın ne olduğu veya nasıl düzeltileceği hakkında hiçbir şey söylemiyor. Ayrıca başka bir yere bakarak faydalı bir şey bulamadım.
Yapmaya çalıştığım şey, hem lombok hem de jackson'ın çok temel kullanımı olduğundan, bu sorunu nasıl çözeceğime dair daha fazla yararlı bilgi bulamamam garip görünüyor. Belki bir şeyi kaçırdım?
" Lombok kullanma " veya " Jackson kullanma " demekten başka , bunu nasıl çözeceğine dair bir fikri olan var mı?