J'ai les DTOs suivants :
@Value
public class PracticeResults {
@NotNull
Map<Long, Boolean> wordAnswers;
}
@Value
public class ProfileMetaDto {
@NotEmpty
String name;
@Email
String email;
@Size(min = 5)
String password;
}
@Value
est une annotation Lombok qui génère un constructeur. Ce qui signifie que cette classe n'a pas de constructeur sans argument.
J'ai utilisé Spring Boot 1.4.3.RELEASE et ObjectMapper
a été capable de désérialiser un tel objet à partir de JSON.
Après la mise à niveau vers Spring Boot 2.0.0.M7, je reçois l'exception suivante :
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of PracticeResults (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
La version de Jackson utilisée dans Spring Boot 1.4.3 est la suivante 2.8.10
et pour Spring Boot 2.0.0.M7 c'est 2.9.2
.
J'ai essayé de chercher ce problème sur Google mais je n'ai trouvé que des solutions avec @JsonCreator
o @JsonProperty
.
Alors, pourquoi cela fonctionne-t-il avec Spring Boot 1.4.3 et échoue-t-il avec Spring Boot 2 ? Est-il possible de configurer le bean pour qu'il se comporte de la même manière que l'ancienne version ?
0 votes
Avez-vous essayé de mettre à jour Jackson avec la dernière version stable 2.9.4 ? Le journal des modifications contient quelques corrections spécifiques liées à la désérialisation des cartes. github.com/FasterXML/jackson/wiki/Jackson-Release-2.9.3
0 votes
@LuisAguilar J'ai essayé une version plus récente mais rien n'a changé. J'ai différents DTO avec quelques chaînes de caractères qui n'ont pas non plus réussi à se désérialiser. Je pense que c'est lié d'une manière ou d'une autre à la configuration du mappeur d'objets de Spring, mais je n'ai rien trouvé concernant les constructeurs par défaut.
0 votes
Quelle version de Lombok utilisez-vous dans chaque cas ?
0 votes
@AndyWilkinson spring 1.4.3 - lombok 1.16.12, spring 2 - lombok 1.16.20
1 votes
@AndyWilkinson wow ! J'ai essayé la nouvelle version de lombok pour spring boot 1.4.3 et j'ai eu la même exception. Est-ce que cela signifie que lombok 1.16.12 a généré un constructeur sans argument avec
@Value
annotation ?1 votes
J'ai essayé de chercher ce problème sur Google mais je n'ai trouvé que des solutions avec
@JsonCreator
o@JsonProperty
C'est la réponse. Jackson a besoin de ces annotations sur un constructeur pour savoir comment y faire correspondre les valeurs ou il a besoin d'une annotationdefault no-args constructor
comme l'indique clairement le message d'erreur, et vous n'avez ni l'un ni l'autre, c'est pourquoi cela ne fonctionne pas.0 votes
@solomkinmv, je n'ai pas pu reproduire votre problème avec Spring Boot 2.0.0.M7, Jackson 2.9.2, Lombok 1.16.12, mais j'ai trouvé un commentaire à l'endroit où cette exception est levée : "Il s'agit soit d'un problème de définition (si aucun créateur applicable n'existe), soit problème d'inadéquation des entrées (sinon) car aucun des créateurs existants ne correspond au jeton." envoyez-vous le même JSON ?
0 votes
@solomkinmv, aucune des deux versions de `@Value ne génère un constructeur par défaut, j'ai vérifié.
0 votes
Spring Boot 2 + Lombok 1.16.12 fonctionne pour moi. Lombok 1.16.20 le casse.