web-dev-qa-db-fra.com

Comment accéder au corps json ordinaire dans le contrôleur Spring rest?

Avoir le code suivant:

@RequestMapping(value = "/greeting", method = POST, consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
@ResponseBody
public String greetingJson(@RequestBody String json) {
    System.out.println("json = " + json); // TODO json is null... how to retrieve plain json body?
    return "Hello World!";
}

L'argument String json est toujours nul malgré l'envoi de json dans le corps.

Note que je ne veux pas de conversion de type automatique, je veux juste le résultat json simple.

Cela fonctionne par exemple:

@RequestMapping(value = "/greeting", method = POST, consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
@ResponseBody
public String greetingJson(@RequestBody User user) {
    return String.format("Hello %s!", user);
}

Je peux probablement utiliser l'argument use the ServletRequest ou InputStream pour récupérer le corps réel, mais je me demande s'il existe un moyen plus simple?

35
Marcel Overdijk

Le meilleur moyen que j'ai trouvé jusqu'à présent est:

@RequestMapping(value = "/greeting", method = POST, consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
@ResponseBody
public String greetingJson(HttpEntity<String> httpEntity) {
    String json = httpEntity.getBody();
    // json contains the plain json string

Faites-moi savoir s'il existe d'autres alternatives.

63
Marcel Overdijk

Vous pouvez simplement utiliser

@RequestBody String pBody

14
aGO

Seul HttpServletRequest a fonctionné pour moi. HttpEntity a donné une chaîne nulle.

import Java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.Apache.commons.io.IOUtils;

@RequestMapping(value = "/greeting", method = POST, consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
@ResponseBody
public String greetingJson(HttpServletRequest request) throws IOException {
    final String json = IOUtils.toString(request.getInputStream());
    System.out.println("json = " + json);
    return "Hello World!";
}
10
Jarno Argillander

moyen le plus simple qui fonctionne pour moi est

@RequestMapping(value = "/greeting", method = POST, consumes = MediaType.ALL_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public String greetingJson(String raw) {
    System.out.println("json = " + raw);
    return "OK";
}
3
david cassidy