2.11以降では、enum(列挙型)の変換に@JsonCreator
は必ずしも必要ではなくなった
下記のようにenumに独自の値を持たせているのであれば、そのフィールドに@JsonValue
をつければシリアライズ、デシアライズともに取り計らってくれるようになったようです。
TestEnum.java
public enum TestEnum {
TEST_A("testA"),TEST_B("testB");
TestEnum(String label) {
this.label = label;
}
@JsonValue
@Getter
private String label;
// このメソッドに@JsonCreatorは不要
public static TestEnum of(String label) {
for (var instance : values()) {
if (instance.label.contentEquals(label))
return instance;
}
throw new IllegalArgumentException();
}
}
下記のような列挙子のみの場合は、@JsonCreator(mode = Mode.DELEGATING)
をつけるように、と説明があります。
TestEnum2.java
public enum TestEnum2 {
TEST_A,TEST_B;
@JsonCreator(mode = Mode.DELEGATING)
public static TestEnum2 of(String name) {
for (var instance : values()) {
if (instance.name().contentEquals(name))
return instance;
}
throw new IllegalArgumentException();
}
}
enumに対して@JsonCreator
をmode=Mode.DEFAULTで使用すると"Input mismatch reading enum"というエラーメッセージを受け取ってしまいます。内部の型推測のルールが変更されたことが原因のようです。@JsonCreator
の引数に@JsonProperty
を使用する場合は、明示的にmode=Mode.PROPERTIESを指定する必要があるようです。
また、不変オブジェクトのデシアライズに関しては、下記も参考になると思います。
https://www.baeldung.com/jackson-deserialize-immutable-objects