3
votes

Contourner les exigences des constructeurs Json Jackson et Lombok

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 commentaires

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


3 Réponses :


2
votes

essayez d'ajouter ceci à votre fichier de configuration lombok:

lombok.anyConstructor.addConstructorProperties=true
config.stopBubbling = true


1 commentaires

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)



0
votes

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:

  1. Ajoutez une annotation @JsonCreator à votre constructeur
  2. Ajoutez @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.


0 commentaires

4
votes

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.


1 commentaires

Fantastique, vous permet également d'utiliser les champs finaux