Tôi đang thử nghiệm kết hợp giữa Jackson và Lombok. Đó là những lớp học của tôi:
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);
}
}
Đó là những JAR mà tôi đang thêm vào classpth:
Lombok: https://projectlombok.org/downloads/lombok.jar (phiên bản 1.16.10)
Chú thích của Jackson: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar
Jackson core: 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
Tôi đang biên dịch nó bằng Netbeans (Tôi không nghĩ rằng điều này thực sự có liên quan, nhưng dù sao tôi cũng đang báo cáo điều này để làm cho nó có thể tái tạo một cách hoàn hảo và trung thực). Năm JAR ở trên được giữ trong một thư mục có tên " lib
" bên trong thư mục dự án (cùng với " src
", " nbproject
", " test
" và " build
"). Tôi đã thêm chúng vào Netbeans thông qua nút " Thêm JAR / Thư mục " trong thuộc tính của dự án và chúng được liệt kê theo thứ tự chính xác như danh sách ở trên. Dự án là một dự án loại "ứng dụng Java" tiêu chuẩn.
Hơn nữa, dự án Netbeans được định cấu hình để " KHÔNG biên dịch khi lưu ", " tạo thông tin gỡ lỗi ", " báo cáo các API không dùng nữa ", " theo dõi các phụ thuộc java ", " xử lý chú thích activacte " và " xử lý chú thích activacte trong trình chỉnh sửa ". Không có bộ xử lý chú thích hoặc tùy chọn xử lý chú thích nào được định cấu hình rõ ràng trong Netbeans. Ngoài ra, -Xlint:all
tùy chọn dòng lệnh "" được chuyển trong dòng lệnh của trình biên dịch và trình biên dịch chạy trên một máy ảo bên ngoài.
Phiên bản javac của tôi là 1.8.0_72 và phiên bản java của tôi là 1.8.0_72-b15. Netbeans của tôi là 8.1.
Dự án của tôi biên dịch tốt. Tuy nhiên, nó ném ra một ngoại lệ trong quá trình thực thi của nó. Ngoại lệ dường như không phải là bất cứ thứ gì trông dễ dàng hoặc rõ ràng có thể sửa chữa được. Đây là đầu ra, bao gồm 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
Tôi đã thử chọc ngẫu nhiên với @Value
và @AllArgsConstructor
chú thích, nhưng tôi không thể làm cho nó tốt hơn.
Tôi đã google ngoại lệ và tìm thấy một báo cáo lỗi cũ trên jackson và một báo cáo khác đang mở, nhưng dường như có liên quan đến một thứ khác . Tuy nhiên, điều này vẫn không cho biết bất cứ điều gì về lỗi này là gì hoặc làm thế nào để sửa chữa nó. Ngoài ra, tôi không thể tìm thấy bất cứ điều gì hữu ích khi tìm kiếm ở một nơi khác.
Vì những gì tôi đang cố gắng làm là sử dụng rất cơ bản của cả lombok và jackson, nên có vẻ kỳ lạ là tôi không thể tìm thấy bất kỳ thông tin hữu ích nào về cách giải quyết vấn đề này. Có lẽ tôi đã bỏ lỡ điều gì đó?
Ngoài việc chỉ nói " không sử dụng lombok " hoặc " không sử dụng jackson ", có ai có ý kiến gì về cách giải quyết vấn đề này không?