Ich experimentiere mit der Kombination von Jackson und Lombok. Das sind meine Klassen:
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);
}
}
Das sind die JARs, die ich der Klasse hinzufüge:
Lombok: https://projectlombok.org/downloads/lombok.jar (Version 1.16.10)
Anmerkungen zu Jackson: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar
Jackson-Kern: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.8.2/jackson-core-2.8.2.jar
Jackson-Datenbindung: 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
Ich kompiliere es mit Netbeans (ich denke nicht, dass dies wirklich relevant ist, aber ich melde dies trotzdem, um es perfekt und originalgetreu reproduzierbar zu machen). Die fünf oben genannten JARs werden in einem Ordner mit dem Namen " lib
" im Projektordner gespeichert (zusammen mit " src
", " nbproject
", " test
" und " build
"). Ich habe sie Netbeans über die Schaltfläche " JAR / Ordner hinzufügen " in den Projekteigenschaften hinzugefügt und sie werden in der genauen Reihenfolge wie in der obigen Liste aufgeführt. Das Projekt ist ein Standardprojekt vom Typ "Java-Anwendung".
Darüber hinaus ist das Netbeans-Projekt so konfiguriert, dass " beim Speichern NICHT kompiliert werden ", " Debugging-Informationen generieren ", " veraltete APIs melden ", " Java-Abhängigkeiten verfolgen ", " Aktivieren von Annotationsprozessen " und " Aktivieren von Annotationsprozessen im Editor " konfiguriert werden . In Netbeans ist kein Annotationsprozessor oder keine Annotationsverarbeitungsoption explizit konfiguriert. Außerdem wird die -Xlint:all
Befehlszeilenoption " " in der Compiler-Befehlszeile übergeben, und der Compiler wird auf einer externen VM ausgeführt.
Die Version meines Java ist 1.8.0_72 und die Version meines Java ist 1.8.0_72-b15. Meine Netbeans sind 8.1.
Mein Projekt lässt sich gut kompilieren. Es wird jedoch eine Ausnahme bei der Ausführung ausgelöst. Die Ausnahme scheint nichts zu sein, was leicht oder offensichtlich reparierbar aussieht. Hier ist die Ausgabe, einschließlich der Stapelverfolgung:
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
Ich habe bereits versucht, zufällig mit den @Value
und @AllArgsConstructor
Anmerkungen zu stöbern, aber ich konnte es nicht besser machen.
Ich googelte die Ausnahme und fand einen alten Fehlerbericht über Jackson und einen anderen, der offen ist, aber mit etwas anderem in Verbindung zu stehen scheint . Dies sagt jedoch immer noch nichts darüber aus, was dieser Fehler ist oder wie er behoben werden kann. Außerdem konnte ich nichts Nützliches finden, das woanders aussah.
Da ich versuche, sowohl Lombok als auch Jackson sehr einfach zu verwenden, scheint es seltsam, dass ich keine nützlicheren Informationen zur Umgehung dieses Problems finden konnte. Vielleicht habe ich etwas verpasst?
Hat jemand eine Idee, wie man das löst, außer nur zu sagen " benutze keinen Lombok " oder " benutze keinen Jackson "?