web-dev-qa-db-ja.com

デフォルトのコンストラクタが存在する場合でも、Object値からデシリアライズできません(デリゲートベースまたはプロパティベースのCreatorはありません)

次のようなクラスがあります

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注釈付きのコンストラクターを持つことを推奨するいくつかのテキストに出会いました。両方を追加しようとしましたが、それでも例外が発生します。ここで何が欠けていますか?

8
nishant

編集:

はるかに良い解決策を見つけたので、ObjectMapperParanamerModule を追加します。

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;
    }
}
1
flavio.donze

私はこれと同じ問題を観察しました。私の問題は、wrongJsonCreatorタイプを使用して引き起こされました。 org.codehaus.jackson.annotate.JsonCreatorを誤って使用しましたが、代わりにcom.fasterxml.jackson.annotation.JsonCreatorを使用する必要がありました。

0