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.

15voto

Dominik Minc Points 111

J'ai eu un problème similaire (en utilisant Jackson, lombok, gradle) et un POJO sans constructeur no args - la solution était d'ajouter

lombok.anyConstructor.addConstructorProperties=true

à la lombok.config fichier

13voto

HAT Points 121

Je sais que c'est un vieux post, mais pour tous ceux qui utilisent Retrofit, cela peut être utile.

Si vous utilisez Retrofit + Jackson + Kotlin + Data classes, vous avez besoin :

  1. ajouter implement group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.7.1-2' à vos dépendances, afin que Jackson puisse désérialiser les classes de données.
  2. Lors de la construction de Retrofit, passez le mappeur Kotlin Jackson, afin que Retrofit utilise le bon mappeur, ex :

    val jsonMapper = com.fasterxml.jackson.module.kotlin.jacksonObjectMapper()
    
    val retrofit = Retrofit.Builder()
          ...
          .addConverterFactory(JacksonConverterFactory.create(jsonMapper))
          .build()

Note : Si Retrofit n'est pas utilisé, @Jayson Minard a une réponse d'approche plus générale.

10voto

Ousama Points 532

J'ai résolu ce problème en ajoutant un constracteur sans argument. Si vous utilisez Lombok il suffit d'ajouter @NoArgsConstructor annotation :

@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
@EqualsAndHashCode
public class User {
    private Long userId;
    private String shortName;
}

6voto

Aaron Lee Points 33

J'utilise rescu avec Kotlin et l'a résolu en utilisant @ConstructorProperties

    data class MyResponse @ConstructorProperties("message", "count") constructor(
        val message: String,
        val count: Int
    )

Jackson utilise @ConstructorProperties. Cela devrait également corriger les @Data de Lombok.

6voto

Gayan Weerakutti Points 1989

Comme le mentionne l'erreur, la classe n'a pas de constructeur par défaut.

Ajout de @NoArgsConstructor à la classe de l'entité devrait régler le problème.

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