L'utilisation de json pour enregistrer et charger des données nécessite un constructeur pour que json charge l'objet, et j'ai du mal à faire fonctionner les annotations lombok avec cela. Que dois-je faire?
Voici à quoi ressemblait ma classe avant et après avoir tenté d'utiliser une annotation pour construire mon élément:
private Item() { }
@Data @AllArgsConstructor @NoArgsConstructor //I don't want this here as it could cause complications in other places. But json requires I have this... public class Item { //after private int id; private int amount; }
Je ne veux pas utiliser l'annotation NoArgsConstructor de lombok car je ne veux pas de constructeur no args pour cette classe. Je me rends compte que je pourrais faire ceci:
@Data public class Item { //before private int id; private int amount; public Item(@JsonProperty("id") int id, @JsonProperty("amount") int amount) { this.id = id; this.amount = amount; } }
Mais j'espérais qu'il y avait une meilleure façon ...
3 Réponses :
essayez d'ajouter ceci à votre fichier de configuration lombok:
lombok.anyConstructor.addConstructorProperties=true config.stopBubbling = true
N'y a-t-il pas de meilleur moyen que cela? N'existe-t-il aucun moyen d'annoter les arguments du constructeur avec @JsonProprty comme dans le premier exemple de code en les ajoutant à AllArgsConstructor dans l'exemple 2? Soit @AllArgsConstructor (argumentsAnnotation = @JsonProperty)
Donc, ce que vous dites, c'est que Jackson nécessite un constructeur no-args pour la désérialisation, et vous ne voulez pas ajouter de constructeurs no-args à vos classes car cela ne fonctionne pas bien avec votre modèle.
Lombok est complètement hors de propos ici - cela ne fait aucune différence que le constructeur no-args soit écrit manuellement ou généré par Lombok, ce sera toujours juste un constructeur no-args.
Votre vraie question est la suivante: puis-je faire fonctionner Jackson sans constructeurs sans argument sur les classes cibles. Il y a déjà plusieurs réponses à cela, vous l'avez presque fait. Voici ce qu'il faut faire:
@JsonCreator
à votre constructeur @JsonProperty ("propName")
aux paramètres du constructeur Vous avez fait le n ° 2 mais pas le n ° 1. Ajoutez cela et cela devrait résoudre votre problème.
Depuis lombok 1.18.4, vous pouvez configurer les annotations copiées dans les paramètres du constructeur. Insérez ceci dans votre lombok.config
:
@Data @AllArgsConstructor public class Item { @JsonProperty("id") private int id; @JsonProperty("amount") private int amount; }
Ensuite, ajoutez simplement @JsonProperty
à vos champs:
lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonProperty
Bien que les paramètres d'annotation puissent sembler inutiles, ils sont en fait obligatoires, car au moment de l'exécution, les noms des paramètres du constructeur ne sont pas disponibles.
Fantastique, vous permet également d'utiliser les champs finaux
essayez d'utiliser
@AllArgsConstructor (suppressConstructorProperties = true)
@YCF_L cette méthode est obsolète
Essayez
@AllArgsConstructor (onConstructor = @__ (@ JsonCreator))
, voir aussi Impossible de désérialiser l'objet le plus simple avec le champ final bu Jackson