Я экспериментирую в объединении Джексона и Ломбока. Это мои классы:
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([email protected]__(@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)
-
Аннотации Джексона: 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
-
Джексон-ломбок: 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/Folder" в свойствах проекта, и они перечислены в точном порядке в списке выше. Проект является стандартным проектом типа "Java-приложение".
Кроме того, проект Netbeans настроен на "НЕ компилировать при сохранении", "генерировать информацию об отладке", "отчитывать устаревшие API", "отслеживать java-зависимости", "активировать аннотацию" и "активировать аннотацию в редакторе" ". Никакой обработчик обработки аннотации или обработки аннотации явно не настроен в Netbeans. Кроме того, параметр командной строки" -Xlint:all
" передается в командной строке компилятора, а компилятор работает на внешней виртуальной машине.
Моя версия 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 [email protected]es(value=[x, z]), interface [email protected]son.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 [email protected]es(value=[x, z]), interface [email protected]son.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 и нашел старый отчет об ошибке на jackson и другой, который открыт, но, похоже, связан с чем-то другим. Тем не менее, это все еще ничего не говорит о том, что это за ошибка или как ее исправить. Кроме того, я не мог найти ничего полезного, смотрящего в другом месте.
Поскольку то, что я пытаюсь сделать, - это очень простое использование как ломбока, так и джексона, кажется странным, что я не мог найти более полезную информацию о том, как обходить эту проблему. Может, я что-то пропустил?
Кроме того, что просто говорю "не используйте ломбок" или "не используйте джексон", есть ли у кого-нибудь представление о том, как это решить?