M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

Jacksonシリアライザの@JsonIgnoreは@JsonPropertyと対にして使う

例によって細かい話です。

現在開発中のアプリケーションではSpring MVCRestConrtollerを利用してクライアント側とJSON形式でデータをやり取りする構成をとっているので、内部的にはJacksonシリアライザによるJavaのオブジェクトとJSONとの相互変換が行われることになります。

ところで、VOのなかにはJSONにしたくないプロパティを持つオブジェクトもあります。Google先生に聞くと「そうしたプロパティには@JsonIgnoreアノテーションを付与すべし」という情報を提供してくれます。このアノテーションはプロパティの実体となるインスタンス・フィールドだけでなくgetterやsetterに個別に指定することもできます(おかげでインターフェースにアノテーションを付与しておき、それを実装するオブジェクトには直接アノテーションを付与しない、という選択も可能になります)。

しかし注意しなくてはならないのはこのアノテーションには副作用のようなもの、つまり「setterにアノテーションが付与されている場合はgetterにそれがなくとも、getterも含めて無視される、その逆もまた然り」というものです。そして連座して無視されてしまうアクセサ・メソッドをJacksonの処理対象に戻すには@JsonPropertyアノテーションを付与して明示する必要があるということです。

In addition, starting with Jackson 1.9, if this is the only annotation associated with a property, it will also cause cause the whole property to be ignored: that is, if setter has this annotation and getter has no annotations, getter is also effectively ignored. It is still possible for different accessors to use different annotations; so if only "getter" is to be ignored, other accessors (setter or field) would need explicit annotation to prevent ignoral (usually JsonProperty).

プロパティから値(オブジェクト参照)を取り出してそのメソッドを呼びだそうとするとNullPointerExceptionが発生するという事象の原因を調べるためJavadocを読んでいて気が付きました。

まったく予測がつかない挙動というわけではありませんが、ちょっとわかりにくい話ではあります(だからこそこうしてJavadocにも注意書きがなされているわけです)。