Я експериментую у поєднанні Джексона та Ломбока. Це мої заняття:
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/io/paradoxical/jackson-lombok/1.1/jackson-lombok-1.1.jar
Я складаю це з Netbeans (я не думаю, що це дійсно актуально, але я все одно повідомляю про це, щоб зробити це ідеально і достовірно відтворюваним). П'ять наведених вище JAR зберігаються у папці " lib
" всередині папки проекту (разом із " src
", " nbproject
", " test
" та " build
"). Я додав їх до Netbeans через " Додати JAR / папку " у властивостях проекту, і вони перераховані в точному порядку, як у списку вище. Проект є стандартним проектом типу "додаток Java".
Крім того, проект Netbeans налаштований на те, що " НЕ компілювати при збереженні ", " генерувати інформацію про налагодження ", " звітувати про застарілі API ", " відстежувати залежності Java ", " обробляти анотації активації " та " обробляти активації анотацій у редакторі ". Жоден процесор анотацій або варіант обробки анотацій явно не налаштовані в Netbeans. Також параметр -Xlint:all
командного рядка передається в командному рядку компілятора, і компілятор працює на зовнішній ВМ.
Версія мого javac - 1.8.0_72, а моя версія java - 1.8.0_72-b15. Мій Netbeans - 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
, але не зміг зробити це краще.
Я погуглив виняток і знайшов старий звіт про помилки на Джексоні та ще один, який є відкритим, але, схоже, пов’язаний з чимось іншим . Однак це все ще нічого не говорить про те, що це за помилка або як її виправити. Крім того, я не міг знайти нічого корисного, дивлячись десь ще.
Оскільки те, що я намагаюся зробити, - це дуже елементарне використання як lombok, так і jackson, здається дивним, що я не міг знайти більше корисної інформації про те, як вирішити цю проблему. Може, я щось пропустив?
Інші , ніж просто сказати « не використовувати Ломбок » або « не використовувати Джексоном », зробіть хто - небудь має ні найменшого уявлення про те , як вирішити цю проблему?