web-dev-qa-db-ja.com

フィールドおよびゲッター/セッターの@JsonPropertyアノテーション

私は、ゲッター/セッターに@JsonPropertyアノテーションを持つ特定のビットコードを継承しました。目的は、Jacksonライブラリを使用してオブジェクトをシリアル化するときに、フィールドにその特定の名前が付けられるようにすることです。

現在のコード:

private String fileName;

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

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

次に、別のツールのために、フィールドにもJsonPropertyで注釈を付ける必要があります。したがって、これは私の変更されたコードになります:

@JsonProperty("FILENAME")
private String fileName;

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

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

誰でもこの同じ注釈をフィールドとゲッター/セッターの両方で使用しましたか?私はネットを見回したが、何も見なかった。

コードをコンパイルして実行しましたが、これが今後問題を引き起こすかどうかはわかりません。これについて何か考えはありますか?

48
OceanBlue

いくつかのテストに基づいた私の観察では、プロパティ名と異なる名前が有効になるということです。

例えばケースを少し変更することを検討してください。

@JsonProperty("fileName")
private String fileName;

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

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

fileNameフィールドとメソッドgetFileNameの両方にfileNameという正しいプロパティ名があり、setFileNameには異なるfileName1があります。この場合ジャクソンは、逆シリアル化の時点でjsonでfileName1属性を探し、シリアル化の時点でfileName1という属性を作成します。

ここで、3つの@JsonPropertyがすべてfileNameのデフォルトのプロパティ名と異なる場合、それらのうちの1つを属性(FILENAME)として選択し、 3つが異なり、例外がスローされます。

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

既存の良い答えに加えて、ジャクソン1.9は「プロパティの統合」を追加することで処理を改善したことに注意してください。

ジャクソン1.8以前では、何をどのようにシリアル化するか(JSONを記述する)を決定するときに、フィールドとゲッターの注釈のみが使用されていました。そして、デシリアライズ(JSONの読み取り)のための唯一のセッターアノテーション。これには、ゲッターとセッターの両方に注釈を付けるなど、「余分な」注釈の追加が必要になる場合がありました。

Jackson 1.9以上では、これらの追加の注釈は必要ありません。それらを追加することはまだ可能です。また、異なる名前が使用されている場合、「分割」プロパティを作成できます(1つの名前を使用してシリアル化、別の名前を使用して逆シリアル化)。これは、名前の変更に役立つことがあります。

9
StaxMan