web-dev-qa-db-de.com

JsonMappingException: Instanz des Java.lang.Integer kann nicht aus dem START_OBJECT-Token deserialisiert werden

Ich wollte einen kleinen und einfachen REST - Dienst mit Spring Boot ..__ schreiben. Hier ist der REST - Servicecode:

@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;
}

Das JSON-Objekt, das ich gesendet habe, lautet wie folgt:

{
    "userId": 3
}

Und hier ist die Ausnahme, die ich bekam: 

WARN 964 --- [XNIO-2-Task-7] .w.s.m.s.DefaultHandlerExceptionResolver: Fehler beim Lesen von HTTP Botschaft: org.springframework.http.converter.HttpMessageNotReadableException: Dokument konnte nicht gelesen werden: Instanz von .__ kann nicht deserialisiert werden. Java.lang.Integer aus dem START_OBJECT-Token bei [Source: [email protected]; Zeile: 1, Spalte: 1]; verschachtelt Ausnahme ist com.fasterxml.jackson.databind.JsonMappingException: Can Instanz des Java.lang.Integer von START_OBJECT .__ nicht deserialisieren. Token bei [Source: [email protected]; Linie 1, Spalte: 1]

5
user2581426

Offensichtlich kann Jackson die übergebene JSON nicht in eine Integer deserialisieren. Wenn Sie darauf bestehen, eine JSON-Darstellung eines User durch den Anforderungstext zu senden, sollten Sie die userId in einer anderen Bean wie folgt kapseln:

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

Verwenden Sie dann diese Bean als Handler-Methodenargument:

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

Wenn Sie den Aufwand für das Erstellen einer anderen Bean nicht mögen, können Sie die userId als Teil von Path Variable übergeben, z. /getuser/15. Um das zu tun:

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

Da Sie im Anforderungstextkörper keine JSON mehr senden, sollten Sie das consumes-Attribut entfernen.

7
Ali Dehghani

Möglicherweise versuchen Sie, eine Anforderung mit einem JSON-Text in seinem Hauptteil von einem Postman-Client oder ähnlichem zu senden:

{
 "userId": 3
}

Dies kann von Jackson nicht deserialisiert werden, da dies keine Ganzzahl ist (scheint es zu sein, ist es aber nicht). Ein Integer-Objekt aus Java.lang Integer ist etwas komplexer. 

Damit Ihre Postman-Anfrage funktioniert, setzen Sie einfach (ohne geschweifte Klammern {}):

3
0