次のようなクラスがあります
class MyClass {
private byte[] payload;
public MyClass(){}
@JsonCreator
public MyClass(@JsonProperty("payload") final byte[] payload) {
this.payload = payload;
}
public byte[] getPayload() {
return this.payload;
}
}
私はジャクソンを使用しているので、シリアライズしてからデシリアライズします。シリアル化は正常に機能しますが、逆シリアル化中にこのエラーメッセージが表示されます-
Cannot construct instance of `mypackage.MyClass` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
私はこの問題についてオンラインで読んでいて、デフォルトのコンストラクターまたは@JsonCreator
注釈付きのコンストラクターを持つことを推奨するいくつかのテキストに出会いました。両方を追加しようとしましたが、それでも例外が発生します。ここで何が欠けていますか?
編集:
はるかに良い解決策を見つけたので、ObjectMapper
に ParanamerModule を追加します。
mapper.registerModule(new ParanamerModule());
Maven:
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-paranamer</artifactId>
<version>${jackson.version}</version>
</dependency>
ParameterNamesModule に対する利点は、-parameters
引数を使用してクラスをコンパイルする必要がないことです。
END EDIT
Jackson 2.9.9では、この単純なPOJOをデシリアライズしようとしましたが、同じ例外が発生し、デフォルトのコンストラクターを追加することで問題が解決しました。
POJO:
public class Operator {
private String operator;
public Operator(String operator) {
this.operator = operator;
}
public String getOperator() {
return operator;
}
}
ObjectMapperおよびSerialize/Deserialize:
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper.setVisibility(PropertyAccessor.CREATOR, Visibility.ANY);
String value = mapper.writeValueAsString(new Operator("test"));
Operator result = mapper.readValue(value, Operator.class);
JSON:
{"operator":"test"}
例外:
com.fasterxml.jackson.databind.exc.MismatchedInputException:
Cannot construct instance of `...Operator` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"operator":"test"}"; line: 1, column: 2]
解決策(デフォルトコンストラクターによるPOJO):
public class Operator {
private String operator;
private Operator() {
}
public Operator(String operator) {
this();
this.operator = operator;
}
public String getOperator() {
return operator;
}
}
私はこれと同じ問題を観察しました。私の問題は、wrongJsonCreatorタイプを使用して引き起こされました。 org.codehaus.jackson.annotate.JsonCreatorを誤って使用しましたが、代わりにcom.fasterxml.jackson.annotation.JsonCreatorを使用する必要がありました。