मैं जैक्सन और लोम्बोक के संयोजन में प्रयोग कर रहा हूं। वे मेरी कक्षाएं हैं:
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);
}
}
वे JAR हैं जिन्हें मैं कक्षा में जोड़ रहा हूं:
लोम्बोक : https://projectlombok.org/downloads/lombok.jar (संस्करण 1.16.10)
जैक्सन एनोटेशन: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar
जैक्सन कोर: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.8.2/jackson-core-2.8.2.jar
जैक्सन डेटाबाइंड: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.8.2/jackson-databind-2.8.2.jar
जैक्सन-लोमबोक: http://repo1.maven.org/maven2/io/paradoxical/jackson-lombok/1.1/jackson-lombok-1.1.jar
मैं इसे नेटबीन्स के साथ संकलित कर रहा हूं (मुझे नहीं लगता कि यह वास्तव में प्रासंगिक है, लेकिन मैं इसे पूरी तरह से और ईमानदारी से प्रतिलिपि प्रस्तुत करने योग्य बनाने के लिए वैसे भी रिपोर्ट कर रहा हूं)। उपरोक्त पाँच JAR को एक फ़ोल्डर में रखा जाता है, जिसे " lib
प्रोजेक्ट फ़ोल्डर के अंदर" (" src
", " nbproject
", " test
" और " build
") के साथ रखा जाता है। मैंने उन्हें प्रोजेक्ट गुणों में " ऐड जार / फोल्डर " बटन के माध्यम से नेटबीन्स में जोड़ा और वे ऊपर की सूची के रूप में सटीक क्रम में सूचीबद्ध हैं। परियोजना एक मानक "जावा एप्लिकेशन" प्रकार की परियोजना है।
इसके अलावा, नेटबींस परियोजना को " सेव पर संकलित न करें ", " डीबगिंग जानकारी उत्पन्न करें ", " रिपोर्ट अपग्रेड किए गए एपीआई ", " ट्रैक जावा निर्भरता ", " एक्टिवेट एनोटेशन प्रोसेडिंग " और " एक्टिक्टेट एनोटेशन एडिटरिंग प्रॉफ़िटिंग फ़ॉर एडिटरिंग " में कॉन्फ़िगर किया गया है । कोई एनोटेशन प्रोसेसर या एनोटेशन प्रोसेसिंग विकल्प स्पष्ट रूप से नेटबीन्स में कॉन्फ़िगर नहीं किया गया है। साथ ही, -Xlint:all
कंपाइलर कमांड लाइन में " " कमांड लाइन विकल्प पास किया गया है, और कंपाइलर बाहरी वीएम पर चलता है।
मेरे जावा का संस्करण 1.8.0_72 है और मेरे जावा का संस्करण 1.8.0_72-b15 है। मेरा नेटबीन्स 8.1 है।
मेरा प्रोजेक्ट ठीक संकलित है। हालांकि, यह इसके निष्पादन में एक अपवाद फेंकता है। अपवाद कुछ भी नहीं लगता है जो आसानी से या स्पष्ट रूप से देखने योग्य है। यहाँ स्टैकट्रेस सहित आउटपुट है:
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
मैंने पहले से ही बेतरतीब ढंग से प्रहार के साथ @Value
और @AllArgsConstructor
एनोटेशन के बारे में कोशिश की , लेकिन मैं इसे बेहतर नहीं बना सका।
मैंने अपवाद को google किया और जैकसन पर एक पुरानी बग रिपोर्ट पाई , और एक और जो खुली है, लेकिन लगता है कि वह किसी और चीज़ से संबंधित है । हालांकि, यह अभी भी कुछ भी नहीं बताता है कि यह बग क्या है या इसे कैसे ठीक किया जाए। इसके अलावा, मुझे कुछ भी उपयोगी नहीं लग रहा था जो कहीं और है।
चूँकि मैं जो करने की कोशिश कर रहा हूँ, वह है लोमबोक और जैक्सन दोनों का बहुत बुनियादी उपयोग, यह अजीब लगता है कि मुझे इस समस्या को हल करने के तरीके के बारे में कोई और उपयोगी जानकारी नहीं मिली। शायद मुझे कुछ याद आया?
केवल यह कहने के अलावा कि " लोबोक का उपयोग न करें " या " जैकसन का उपयोग न करें ", क्या किसी को इस बारे में कोई विचार नहीं है कि इसे कैसे हल किया जाए?