web-dev-qa-db-fra.com

ne peut pas désérialiser à partir de la valeur de l'objet (pas de créateur basé sur les délégués ou les propriétés) même avec le constructeur par défaut présent

J'ai une classe qui ressemble

class MyClass {
    private byte[] payload;

    public MyClass(){}

    @JsonCreator
    public MyClass(@JsonProperty("payload") final byte[] payload) {
        this.payload = payload;
    }

    public byte[] getPayload() {
        return this.payload;
    }

}

J'utilise Jackson afin de sérialiser puis de désérialiser. La sérialisation fonctionne bien, mais pendant la désérialisation, je reçois ce message d'erreur -

Cannot construct instance of `mypackage.MyClass` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

Je lisais ce problème en ligne et j'ai rencontré plusieurs textes recommandant d'avoir un constructeur par défaut ou un constructeur avec @JsonCreator annotation. J'ai essayé d'ajouter les deux, mais j'obtenais toujours cette exception. Qu'est-ce que j'oublie ici?

8
nishant

MODIFIER:

Je viens de trouver une bien meilleure solution, ajoutez le ParanamerModule au ObjectMapper:

mapper.registerModule(new ParanamerModule());

Maven:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-paranamer</artifactId>
    <version>${jackson.version}</version>
</dependency>

L'avantage par rapport au ParameterNamesModule semble être que les classes n'ont pas besoin d'être compilées avec le -parameters argument.

FIN DE LA MODIFICATION

Avec Jackson 2.9.9, j'ai essayé de désérialiser ce POJO simple et j'ai rencontré la même exception, l'ajout d'un constructeur par défaut a résolu le problème:

POJO:

public class Operator {

    private String operator;

    public Operator(String operator) {
        this.operator = operator;
    }

    public String getOperator() {
        return operator;
    }
}

ObjectMapper et sérialiser/désérialiser:

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"}

Exception:

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]

Solution (POJO avec constructeur par défaut):

public class Operator {

    private String operator;

    private Operator() {
    }

    public Operator(String operator) {
        this();
        this.operator = operator;
    }

    public String getOperator() {
        return operator;
    }
}
1
flavio.donze

J'ai observé ce même problème. Mon problème a été provoqué par l'utilisation du type JsonCreator incorrect . J'ai incorrectement utilisé org.codehaus.jackson.annotate.JsonCreator, mais j'aurais dû utiliser com.fasterxml.jackson.annotation.JsonCreator à la place.

0