Bonjour,
Je cherche à implémenter un service REST PATCH en JAVA, qui respecte la rfc7396 (https://tools.ietf.org/html/rfc7396 ).
Cette rfc définit que si on a un objet défini comme ceci:
Alors on peut modifier le champ a et supprimer le champ f, sans toucher à la valeur des autres champs, en envoyant ce json:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 { "a": "b", "c": { "d": "e", "f": "g" } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 { "a":"z", "c": { "f": null } }
On peut donc remarquer que:
- Si le champ est absent dans le json, aucune modification n'est effectuée
- Si le champ est présent dans le json mais null, la valeur champ est supprimée
- Si le champ est présent dans le json et non null, la valeur du champ est remplacée
Seulement voilà, lors de la déserialisation du json, on perd la différence entre l'absence de la valeur dans le json et sa présence en null. Dans les deux cas, la valeur attribuée au champ de l'objet java est null.
J'utilise la balise @RequestBody avec un dto représentant mon json complet pour effectuer cette déserialisation, comme utilisée ici: https://www.baeldung.com/http-put-pa...ference-spring
J'ai trouvé une solution, qui consiste à passer tous les champs java du dto au type Optional<T>, comme garretwilson ici https://github.com/FasterXML/jackson...ment-385266611
Émettons que l'on ait un champ Optional<String> toto dans le dto, alors lors de la déserialisation, on a:
- Si le champ est absent dans le json, toto est null
- Si le champ est présent dans le json mais null, toto n'est pas null mais est vide
- Si le champ est présent dans le json et non null, toto n'est pas null et contient la valeur du champ
C'est pas mal car on peut faire la différence entre l'absence du json et la présence null, mais on se retrouve avec un objet de type Optional<T> pouvant être null, ce qui est une mauvaise pratique.
Comment auriez-vous fait? Connaissez-vous une manière plus propre de procéder?
Merci pour votre aide![]()
Partager