ฉันกำลังทดลองในการรวมแจ็คสันและลอมบอก นี่คือชั้นเรียนของฉัน:
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 ที่ฉันเพิ่มเข้าไปใน classpth:
ลอมบอก: https://projectlombok.org/downloads/lombok.jar (เวอร์ชัน 1.16.10)
คำอธิบายประกอบของ Jackson: 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
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
ฉันกำลังรวบรวมกับ Netbeans (ฉันไม่คิดว่าสิ่งนี้เกี่ยวข้องจริงๆ แต่ฉันกำลังรายงานเรื่องนี้เพื่อให้ทำซ้ำได้อย่างสมบูรณ์แบบและน่าเชื่อถือ) JAR ทั้งห้าด้านบนจะถูกเก็บไว้ในโฟลเดอร์ชื่อ " lib
" ภายในโฟลเดอร์โครงการ (พร้อมด้วย " src
", " nbproject
", " test
" และbuild
") ฉันเพิ่มลงใน Netbeans ผ่านปุ่ม " เพิ่ม JAR / โฟลเดอร์ " ในคุณสมบัติของโปรเจ็กต์และมีการระบุไว้ในลำดับที่ถูกต้องตามรายการด้านบน โปรเจ็กต์นี้เป็นโปรเจ็กต์ประเภท "แอปพลิเคชัน Java" มาตรฐาน
นอกจากนี้โครงการ Netbeans ได้รับการกำหนดค่าให้ " ไม่รวบรวมเมื่อบันทึก ", " สร้างข้อมูลการแก้ไขจุดบกพร่อง ", " รายงาน API ที่เลิกใช้งาน ", " ติดตามการอ้างอิงจาวา ", "การตรวจสอบคำอธิบายประกอบการเปิดใช้งาน " และ "การตรวจสอบคำอธิบายประกอบการเปิดใช้งานในตัวแก้ไข " ไม่มีตัวประมวลผลคำอธิบายประกอบหรือตัวเลือกการประมวลผลคำอธิบายประกอบที่กำหนดไว้อย่างชัดเจนใน Netbeans นอกจากนี้-Xlint:all
ตัวเลือกบรรทัดคำสั่ง "" จะถูกส่งผ่านในบรรทัดคำสั่งของคอมไพเลอร์และคอมไพเลอร์จะทำงานบน VM ภายนอก
เวอร์ชัน javac ของฉันคือ 1.8.0_72 และเวอร์ชัน java ของฉันคือ 1.8.0_72-b15 Netbeans ของฉันคือ 8.1
โครงการของฉันรวบรวมได้ดี อย่างไรก็ตามมันมีข้อยกเว้นในการดำเนินการ ข้อยกเว้นดูเหมือนจะไม่ใช่สิ่งที่ดูง่ายหรือแก้ไขได้ชัดเจน นี่คือผลลัพธ์รวมถึง 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
ฉันได้ลองสุ่มจิ้มด้วยคำอธิบายประกอบ@Value
และ@AllArgsConstructor
คำอธิบายประกอบแล้ว แต่ไม่สามารถทำให้ดีขึ้นได้
ฉัน google'd ข้อยกเว้นและพบว่ามีการรายงานข้อผิดพลาดเก่าบนแจ็คสันและอีกสิ่งหนึ่งที่จะเปิด แต่ดูเหมือนว่าจะเกี่ยวข้องกับสิ่งอื่น อย่างไรก็ตามสิ่งนี้ยังไม่ได้บอกอะไรเกี่ยวกับข้อบกพร่องนี้หรือวิธีแก้ไข นอกจากนี้ฉันไม่พบสิ่งที่เป็นประโยชน์เมื่อมองหาที่อื่น
เนื่องจากสิ่งที่ฉันพยายามทำคือการใช้งานทั้งลอมบ็อกและแจ็คสันขั้นพื้นฐานดูเหมือนจะแปลกที่ฉันไม่พบข้อมูลที่เป็นประโยชน์เพิ่มเติมเกี่ยวกับวิธีแก้ปัญหานี้ บางทีฉันอาจพลาดอะไรไป?
นอกจากพูดว่า " ไม่ใช้ลอมบอก " หรือ " ไม่ใช้แจ็คสัน " มีใครคิดวิธีแก้ปัญหานี้บ้างไหม