332 votes

Il n'existe pas de créateurs, comme la construction par défaut) : on ne peut pas désérialiser à partir de la valeur d'un objet (il n'existe pas de créateur basé sur un délégué ou une propriété).

J'essaie de consommer une API en utilisant Retrofit et Jackson pour désérialiser. J'obtiens l'erreur onFailure No Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator .

2 votes

Il semble que vous n'utilisiez pas le module Jackson pour Kotlin, qui fonctionne avec les classes de données qui n'ont pas de constructeur par défaut, ce qui n'est pas le cas de la vôtre. Vérifiez ce module et voyez si vous avez des problèmes par la suite.

0 votes

Veuillez modifier la réponse acceptée.

318voto

Bek Points 1102

Raison : Cette erreur se produit parce que la bibliothèque jackson ne sait pas comment créer votre modèle qui n'a pas de constructeur vide et que le modèle contient un constructeur avec des paramètres qui n'ont pas été annotés avec la balise @JsonProperty("field_name") . Par défaut, le compilateur java crée un constructeur vide si vous n'avez pas ajouté de constructeur à votre classe.

Solution : Ajoutez un constructeur vide à votre modèle ou annotez les paramètres du constructeur avec le symbole @JsonProperty("field_name")

Si vous utilisez une classe de données Kotlin, vous pouvez également utiliser les annotations suivantes @JsonProperty("field_name") ou s'inscrire module jackson kotlin a ObjectMapper .

Vous pouvez créer vos modèles en utilisant http://www.jsonschema2pojo.org/ .

115voto

Fede Mika Points 692

Je suis arrivé ici en cherchant cette erreur :

No Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator

Rien à voir avec Retrofit mais si vous utilisez Jackson, cette erreur a été résolue en ajoutant un constructeur par défaut à la classe qui provoque l'erreur. Plus d'informations ici : https://www.baeldung.com/jackson-exception

26 votes

Si vous voulez que votre objet soit immuable, vous ne voudrez pas créer un constructeur par défaut. Ajout de @JsonCreator o @ConstructorProperties({"prop1Name", "propr2Name"}) sur le constructeur résout l'erreur ci-dessus.

4 votes

Si vous utilisez Lobok et @Data, assurez-vous que vos champs ne sont pas finaux, sinon le constructeur vide n'est pas possible. Donc cela ne fonctionne pas : @Data static class LoginResponse { private final String token, message; private final int status; } Mais ça marche : @Data static class LoginResponse { private String token, message; private int status; }

1 votes

@Vladtn -- merci, c'était mon problème ;0

109voto

silver_fox Points 417

Si vous utilisez Lombok sur un Modèle POJO assurez-vous d'avoir ces annotations :

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor

Cela peut varier, mais assurez-vous @Getter y notamment @NoArgsConstructor .

9 votes

@NoArgsConstructor est ce qui a résolu ma situation. Mes annotations complètes sont @Data @AllArgsConstructor @NoArgsConstructor @Entity @JsonInclude(Include.NON_DEFAULT)

7 votes

@Data est équivalent à @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode Alors peut-être seulement @NoArgsConstructor est nécessaire

0 votes

@54l3d @Data ne comprendra pas @RequiredArgsConstructor si vous spécifiez une autre annotation de constructeur avec elle.

75voto

Yoni Gibbs Points 2858

Vous devez utiliser jackson-module-kotlin pour désérialiser les classes de données. Voir aquí pour les détails.

Le message d'erreur ci-dessus est ce que Jackson vous donne si vous essayez de désérialiser une valeur dans une classe de données lorsque ce module n'est pas activé ou, même s'il l'est, lorsque le module ObjectMapper qu'il utilise n'a pas le KotlinModule enregistré. Par exemple, prenez ce code :

data class TestDataClass (val foo: String)

val jsonString = """{ "foo": "bar" }"""
val deserializedValue = ObjectMapper().readerFor(TestDataClass::class.java).readValue<TestDataClass>(jsonString)

Cette opération échouera avec l'erreur suivante :

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `test.SerializationTests$TestDataClass` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)

Si vous modifiez le code ci-dessus et remplacez ObjectMapper con jacksonObjectMapper (qui renvoie simplement un ObjectMapper con el KotlinModule enregistré), cela fonctionne. c.-à-d.

val deserializedValue = jacksonObjectMapper().readerFor(TestDataClass::class.java).readValue<TestDataClass>(jsonString)

Je ne suis pas sûr de ce qui se passe du côté d'Android, mais il semble que vous devrez faire en sorte que le système utilise l'option jacksonObjectMapper pour effectuer la désérialisation.

19voto

MichalPr Points 21

J'utilise Quarkus, Jackson et Lombok. J'ai donc résolu ce problème en ajoutant @Jacksonized sur la classe du modèle. Donc tous les attributs sont :

@Jacksonized //missing
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X