@ JsonProperty annotation sur le terrain ainsi que getter/setter

j'ai hérité d'un certain code bit qui a l'annotation @JsonProperty sur getter/setters. Le but est que lorsque l'objet est sérialisé en utilisant la bibliothèque Jackson, les champs ont 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 Annoter le champ avec JsonProperty aussi. Ce sera donc mon code modifié:

@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 utilisé ce même annotation sur les deux - le terrain ainsi que de la lecture/définition? J'ai regardé autour du filet mais je n'ai rien vu.

j'ai compilé et lancé le code mais je ne suis pas sûr que cela causerait des problèmes plus tard. Des idées sur ce point?

44
demandé sur OceanBlue 2012-07-17 20:29:37

2 réponses

mes observations basées sur quelques tests ont été que n'importe quel nom différent du nom de la propriété est celui qui prend effet:

Pour les eg. 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;
}

fileName champ, et la méthode getFileName, avoir le nom de propriété correct de fileName et setFileName est différent de fileName1, dans ce cas, Jackson va chercher une fileName1 attribut dans json au point de désérialisation et va créer un attribut appelé fileName1 au point de sérialisation.

maintenant, pour en venir à votre cas, où tous les trois @JsonProperty diffèrent du nom propre par défaut de fileName, il suffit de choisir l'un d'eux en tant qu'attribut(FILENAME), et si l'un des trois avait été différent, il aurait fait exception:

java.lang.IllegalStateException: Conflicting property name definitions
42
répondu Biju Kunjummen 2012-07-17 18:45:37

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

dans Jackson 1.8 et avant, seules les annotations field et getter ont été utilisées pour déterminer quoi et comment sérialiser (écrire JSON); et seulement et les annotations setter pour la deserialisation (lire JSON). Cela exige parfois plus de annotations "extra", comme annoter getter et setter.

avec Jackson 1.9 et au-dessus de ces annotations supplémentaires ne sont pas nécessaires. Il est encore possible de les ajouter; et si différents noms sont utilisés, on peut créer des propriétés "split" (sérialiser en utilisant un nom, désérialiser en utilisant un autre): ceci est parfois utile pour une sorte de renommage.

8
répondu StaxMan 2012-07-18 19:02:25