Ich kann nicht machen, dass Jackson und Lombok zusammen arbeiten
Ich bin das Experimentieren in 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 Gläser, die ich hinzufüge, in der classpth:
- Lombok: https://projectlombok.org/downloads/lombok.jar (version 1.16.10)
- Jackson Anmerkungen: 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 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
Ich bin kompilieren mit Netbeans (ich glaube nicht, dass das wirklich relevant ist, aber ich bin melden jedenfalls, um es perfekt und originalgetreu reproduzierbar). Die fünf Gläser, die oben gehalten werden, in einem Ordner namens "lib
" im Projekt-Ordner (zusammen mit "src
", "nbproject
", "test
" und "build
"). Ich Sie in Netbeans über den "Add JAR/Folder" - button in der Projekt-Eigenschaften, und Sie sind aufgelistet in der exakten Reihenfolge wie in der Liste oben. Das Projekt ist ein standard "Java-Anwendung" - Typ-Projekt.
Weiter, das Netbeans-Projekt konfiguriert ist, um "NICHT kompilieren auf speichern", "generate debugging info", "Bericht veralteten APIs", "track java-Abhängigkeiten", "activacte annotation Verarbeitung" und "activacte annotation Verarbeitung im editor". Keine annotation-Prozessor oder annotation processing option explizit konfiguriert ist, in Netbeans. Auch die "-Xlint:all
" command-line-option übergeben, die in der compiler-Befehlszeile, und der compiler läuft auf einem externen VM.
Meine javac-version ist 1.8.0_72 und meine java version ist 1.8.0_72-b15. Mein Netbeans 8.1.
Mein Projekt kompiliert einwandfrei. Allerdings wirft es eine Ausnahme in seiner Ausführung. Die Ausnahme don ' T scheint etwas zu sein, sieht leicht oder offensichtlich fixierbar. Hier ist die Ausgabe, einschließlich der 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
Ich habe bereits versucht über zufällig Stossen mit der @Value
und @AllArgsConstructor
Anmerkungen, aber ich konnte nicht machen es besser.
Ich google würde die Ausnahme und fand einen alten bug-report von jacksonund anderen eine, die offen ist, aber scheint zu sein, in Bezug auf etwas anderes. Dies aber immer noch nicht erzählt, was ist dieser bug oder wie man es beheben. Auch konnte ich nicht finden, etwas nützliches zu sehen, dass irgendwo sonst.
Da das, was ich versuche zu tun, ist sehr einfache Nutzung sowohl lombok und jackson, scheint es seltsam, dass ich nicht finden konnte, mehr nützliche Informationen darüber, wie Sie dieses Problem umgehen. Vielleicht habe ich etwas verpasst?
Andere als einfach zu sagen: "nicht verwenden, lombok" oder "nicht verwenden jackson", jemand hat eine Vorstellung darüber, wie dieses Problem zu lösen?
InformationsquelleAutor der Frage Victor Stafusa | 2016-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte genau das selbe Problem "gelöst", indem die
suppressConstructorProperties = true
parameter (mit deinem Beispiel):Jackson offenbar nicht wie die
java.Bohnen.ConstructorProperties
annotation Hinzugefügt Konstruktoren. DiesuppressConstructorProperties = true
parameter teilt Lombok Sie nicht, fügen Sie es (standardmäßig).InformationsquelleAutor der Antwort Donovan Muller
@AllArgsConstructor(suppressConstructorProperties = true)
ist veraltet. Definierenlombok.anyConstructor.suppressConstructorProperties=true
(https://projectlombok.org/features/configuration) und ändern Sie den POJO ' s lombok annotation von@Value
zu@Data
+@NoArgsConstructor
+@AllArgsConstructor
für mich funktioniert.InformationsquelleAutor der Antwort yyy
Wenn Sie möchten, unveränderliches, sondern ein json serialisierbar POJO mit lombok und jackson.
Verwenden jacksons neue annotation auf Ihre lomboks builder @JsonPOJOBuilder(withPrefix = "")
Ich habe versucht, diese Lösung, und es funktioniert sehr gut.
Ein Beispiel für die Verwendung
InformationsquelleAutor der Antwort Ganesan Dharmalingam
Erhalten Sie Jackson zu spielen mit gerade über alles wenn Sie seine "Mixins" - Muster. Im Grunde, es gibt Ihnen die Möglichkeit zum hinzufügen von Jackson Anmerkungen auf einer vorhandenen Klasse, ohne tatsächlich zu ändern, Klasse. Ich bin Neigung in Richtung empfehle es hier eher als einen Lombok-Lösung, denn dies löst ein problem, das Jackson mit Jackson-feature, so es ist wahrscheinlich mehr Arbeit langfristig.
InformationsquelleAutor der Antwort David Ehrmann
Habe ich alle meine Klassen mit Anmerkungen wie diese:
Er arbeitete mit allen Lombok und Jackson-Versionen für mindestens ein paar Jahre.
Beispiel:
Und das ist es.
Lombok und Jackson spielen zusammen wie ein Charme.
InformationsquelleAutor der Antwort where_
Zusätzlich zu den Daten der Klasse, es sollte korrekt konfiguriert ObjectMapper.
In diesem Fall ist es ok arbeitet mit einem ParameterNamesModule Konfiguration und Einstellung der Sichtbarkeit der Felder und Schöpfer Methoden
Dann sollte es funktionieren wie erwartet.
InformationsquelleAutor der Antwort Hector Delgado
Ich hatte Probleme mit dem bekommen von Lombok, nicht fügen Sie die
ConstructorProperies
annotation also ging den anderen Weg und Behinderte Jackson aus der Blick auf die annotation.Der Täter ist JacksonAnnotationIntrospector.findCreatorAnnotation. Hinweis:
Beachten Sie auch JacksonAnnotationIntrospector.setConstructorPropertiesImpliesCreator:
Also zwei Optionen, entweder die
MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES
auf false ein, oder erstellen Sie eineJacksonAnnotationIntrospector
setsetConstructorPropertiesImpliesCreator
zufalse
und setzen Sie dieseAnnotationIntrospector
in dieObjectMapper
über ObjectMapper.setAnnotationIntrospector.Beachten Sie ein paar Dinge, ich bin mit Jackson 2.8.10 und in dieser version
MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES
existiert nicht. Ich bin mir nicht sicher in welcher version von Jackson wurde Hinzugefügt. Also, wenn Sie es nicht ist, verwenden Sie dieJacksonAnnotationIntrospector.setConstructorPropertiesImpliesCreator
Mechanismus.InformationsquelleAutor der Antwort John B
Benötigen Sie dieses Modul.
https://github.com/FasterXML/jackson-modules-java8
schalten -Parameter flag für den compiler.
InformationsquelleAutor der Antwort Matt Broekhuis