UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Java】デフォルトコンストラクタをprivateにしてたらObjectMapperでデシリアライズが失敗した

JacksonのObjectMapperを使って、あるオブジェクトをデシリアライズしようとしたところ「ofコンストラクタが見つからない」というエラーが発生してでシリアライズが失敗した

原因はわからないままだが、やったことをメモ

失敗したクラスは以下

@Value
public class Coordinate {

  private Coordinate(String lat, String lon) {
    this.lat = lat;
    this.lon = lon;
  }

  @JsonCreator
  public static Coordinate of(String lat, String lon) {
    return new Coordinate(lat, lon);
  }

  /** Latitude. */
  String lat;

  /** Longitude. */
  String lon;
}

Lombok@Valueをつけてイミュータブルにし、デフォルトコンストラクタはprivateにして外部から生成されないようにする

そして、@JsonCreatorをつけて、インスタンス生成はofコンストラクタを使うように設定していた

ただ、このofコンストラクタが見つからないというエラー

@Value(staticConstructor="of")をつけてみたが、それでもダメだった

結局デフォルトコンストラクタのprivateを消したら(デフォルトコンストラクタを消したら)動いた

@Value
public class Coordinate {

-  private Coordinate(String lat, String lon) {
-    this.lat = lat;
-    this.lon = lon;
-  }
-
-  @JsonCreator
  public static Coordinate of(String lat, String lon) {
    return new Coordinate(lat, lon);
  }

  /** Latitude. */
  String lat;

  /** Longitude. */
  String lon;
}

デフォルトコンストラクタをprivateにする設計上の意図があったが、うまく動かないので一旦これでいく