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:

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

Schreibe einen Kommentar