web-dev-qa-db-fra.com

@JsonProperty annotation sur le champ ainsi que getter / setter

J'ai hérité d'un certain code binaire comportant l'annotation @JsonProperty sur getter/setters. Le but est que, lorsque l'objet est sérialisé à l'aide de la bibliothèque de Jackson, les champs portent ce nom spécifique.

Code actuel:

private String fileName;

@JsonProperty("FILENAME")
public String getFileName()
{
    return fileName;
}

@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

Maintenant, pour un autre outil, je dois également annoter le champ avec JsonProperty. Donc ce sera mon code changé:

@JsonProperty("FILENAME")
private String fileName;

@JsonProperty("FILENAME")
public String getFileName()
{
    return fileName;
}

@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

Quelqu'un a-t-il utilisé la même annotation sur le champ ainsi que sur le getter/setters? J'ai regardé autour du filet mais je n'ai rien vu.

J'ai compilé et exécuté le code, mais je ne sais pas si cela causerait des problèmes par la suite. Des idées à ce sujet?

48
OceanBlue

Mes observations basées sur quelques tests ont été que tout nom qui diffère du nom de propriété est celui qui prend effet:

Pour par exemple. envisager une légère modification de votre cas:

@JsonProperty("fileName")
private String fileName;

@JsonProperty("fileName")
public String getFileName()
{
    return fileName;
}

@JsonProperty("fileName1")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

Le champ fileName et la méthode getFileName ont le nom correct de la propriété fileName et setFileName a un nom différent fileName1, dans ce cas, Jackson cherchera un fileName1 attribut json au point de désérialisation et créera un attribut appelé fileName1 au point de la sérialisation.

Maintenant, pour en venir à votre cas, où les trois @JsonProperty diffèrent du nom de propriété par défaut de fileName, il choisirait simplement l’un d’eux comme attribut (FILENAME) et aurait les trois diffèrent, il aurait jeté une exception:

Java.lang.IllegalStateException: Conflicting property name definitions
44
Biju Kunjummen

En plus des bonnes réponses existantes, notez que Jackson 1.9 a amélioré la gestion en ajoutant "unification de propriété", ce qui signifie que TOUTES les annotations provenant de parties différentes d'une propriété logique sont combinées, en utilisant (normalement) une priorité intuitive.

Dans Jackson 1.8 et les versions antérieures, seules les annotations de champ et de lecture étaient utilisées pour déterminer quoi et comment sérialiser (écriture JSON); et seulement et des annotations de setter pour la désérialisation (lecture de JSON). Cela nécessitait parfois l’ajout d’annotations "supplémentaires", telles que l’annotation à la fois du getter et du setter.

Avec Jackson 1.9 et supérieur, ces annotations supplémentaires ne sont PAS nécessaires. Il est encore possible d'ajouter ceux-ci; et si différents noms sont utilisés, il est possible de créer des propriétés "scindées" (sérialisation utilisant un nom, désérialisation utilisant un autre): ceci est parfois utile pour renommer.

9
StaxMan