Com.fasterxml.jackson.databind.ObjectMapperクラス(com.fasterxml.jackson.core:jackson-databind:2.9.5)を使用しています次のクラスのオブジェクトを逆シリアル化しようとしています。
class MyClass {
String name;
MyClass(String name) {
this.name = name;
}
}
私が現在実行しているコードは次のとおりです。
MyClass myClass = new MyClass("test");
objectMapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule())
.configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
String text = objectMapper.writeValueAsString(myClass);
objectMapper.readValue(text, MyClass.class);
例外をスローする最後の行で失敗します:
com.fasterxml.jackson.databind.exc.MismatchedInputException:
com.pckge.MyClass
のインスタンスを作成できません(少なくとも1つの作成者が存在します):[ソース:でオブジェクト値からデシリアライズできません(デリゲートまたはプロパティベースの作成者なし)文字列) "{"名前 ":"テスト "}";行:1、列:2]
私の目標は、MyClassのコンストラクターでJsonCreatorやJsonPropertiesなどのアノテーションを使用せずにオブジェクトを正常に逆シリアル化できるようにオブジェクトマッパーを構成することです。
どうもありがとう!
編集1:@Deanによる返信は問題を解決します。ただし、デフォルトのコンストラクターも使用したくありません。
ジャクソンは値を設定するためにゲッターとセッターを使用します。したがって、クラスを変更する必要があります。
class MyClass {
String name;
MyClass(String name) {
this.name = name;
}
MyClass(){}
public void setName(String name) {
this.name = name;
}
public String getName(String name) {
return this.name;
}
}
デフォルトのコンストラクターなしでこれを解決する適切な方法は、クラスコンストラクターにJsonCreatorおよびJsonPropertyアノテーションを追加することです。
class MyClass {
String name;
@JsonCreator
MyClass(@JsonProperty("name") String name) {
this.name = name;
}
...
}
loombokを使用している場合は、クラスの@Builderアノテーションを削除してください。これが私の問題でした。