J'expérimente en combinant Jackson et Lombok. Ce sont mes cours:
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);
}
}
Ce sont les JAR que j'ajoute à la classe:
Lombok: https://projectlombok.org/downloads/lombok.jar (version 1.16.10)
Annotations de Jackson: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar
Noyau de Jackson: 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
Je le compile avec Netbeans (je ne pense pas que ce soit vraiment pertinent, mais je le rapporte quand même pour le rendre parfaitement et fidèlement reproductible). Les cinq fichiers JAR ci-dessus sont conservés dans un dossier appelé " lib
" à l'intérieur du dossier du projet (avec " src
", " nbproject
", " test
" et " build
"). Je les ai ajoutés à Netbeans via le bouton " Ajouter JAR / Dossier " dans les propriétés du projet et ils sont répertoriés dans l'ordre exact de la liste ci-dessus. Le projet est un projet standard de type "application Java".
De plus, le projet Netbeans est configuré pour " NE PAS compiler lors de la sauvegarde ", " générer des informations de débogage ", " signaler les API obsolètes ", " suivre les dépendances java ", "le traitement des annotations activacte " et "le traitement des annotations activacte dans l'éditeur ". Aucun processeur d'annotation ou option de traitement d'annotation n'est explicitement configuré dans Netbeans. En outre, l' -Xlint:all
option de ligne de commande " " est transmise dans la ligne de commande du compilateur et le compilateur s'exécute sur une machine virtuelle externe.
La version de mon javac est 1.8.0_72 et la version de ma java est 1.8.0_72-b15. Mon Netbeans est 8.1.
Mon projet se compile bien. Cependant, il lève une exception dans son exécution. L'exception ne semble pas être tout ce qui semble facilement réparable ou évident. Voici la sortie, y compris le 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
J'ai déjà essayé de piquer au hasard avec les annotations @Value
et @AllArgsConstructor
, mais je ne pouvais pas faire mieux.
J'ai cherché l'exception sur Google et j'ai trouvé un ancien rapport de bogue sur jackson , et un autre qui est ouvert, mais semble être lié à autre chose . Cependant, cela ne dit toujours rien sur ce qu'est ce bogue ou comment le corriger. De plus, je n'ai rien trouvé d'utile à chercher ailleurs.
Étant donné que ce que j'essaie de faire est une utilisation très basique de lombok et de jackson, il semble étrange que je ne puisse pas trouver d'informations plus utiles sur la façon de contourner ce problème. Peut-être ai-je manqué quelque chose?
À part simplement de dire « n'utilisez pas lombok » ou « n'utilisez pas jackson », est-ce que quelqu'un a une idée sur la façon de résoudre ce problème?