web-dev-qa-db-fra.com

JsonMappingException: impossible de désérialiser l'instance de Java.lang.Integer à partir du jeton START_OBJECT

Je voulais écrire un petit et simple service REST à l'aide de Spring Boot . Voici le code de service REST:

@Async
@RequestMapping(value = "/getuser", method = POST, consumes = "application/json", produces = "application/json")
public @ResponseBody Record getRecord(@RequestBody Integer userId) {
    Record result = null;
    // Omitted logic

    return result;
}

L'objet JSON que j'ai envoyé est le suivant:

{
    "userId": 3
}

Et voici l'exception que j'ai eu: 

WARN 964 --- [XNIO-2 tâche 7] .w.s.m.s.DefaultHandlerExceptionResolver: Impossible de lire HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Impossible de lire le document: impossible de désérialiser une instance de Java.lang.Integer hors du jeton START_OBJECT dans [Source: Java.io.PushbackInputStream@12e7333c; ligne: 1, colonne: 1]; imbriqué l'exception est com.fasterxml.jackson.databind.JsonMappingException: Can ne pas désérialiser l'instance de Java.lang.Integer à partir de START_OBJECT jeton à [Source: Java.io.PushbackInputStream@12e7333c; ligne 1, colonne: 1]

5
user2581426

De toute évidence, Jackson ne peut pas désérialiser le JSON transmis en un Integer. Si vous insistez pour envoyer une représentation JSON d'un utilisateur via le corps de la requête, vous devez encapsuler la variable userId dans un autre bean, comme suit:

public class User {
    private Integer userId;
    // getters and setters
}

Puis utilisez ce bean comme argument de votre méthode de gestion:

@RequestMapping(...)
public @ResponseBody Record getRecord(@RequestBody User user) { ... }

Si vous n'aimez pas la surcharge liée à la création d'un autre bean, vous pouvez transmettre la variable userId dans le cadre de Path Variable, par exemple. /getuser/15. Pour pouvoir faire ça:

@RequestMapping(value = "/getuser/{userId}", method = POST, produces = "application/json")
public @ResponseBody Record getRecord(@PathVariable Integer userId) { ... }

Puisque vous n'envoyez plus de JSON dans le corps de la demande, vous devez supprimer cet attribut consumes.

7
Ali Dehghani

Peut-être essayez-vous d’envoyer une demande avec le texte JSON dans le corps d’un client Postman ou quelque chose de similaire, comme ceci:

{
 "userId": 3
}

Cela ne peut pas être désérialisé par Jackson car ce n'est pas un entier (il semble l'être, mais ce n'est pas le cas). Un objet Integer de Java.lang Integer est un peu plus complexe. 

Pour que votre requête Postman fonctionne, il vous suffit de mettre (sans accolades {}):

3
0
Javier Sanchez C