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]
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.
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