Как получить доступ к простому корпусу json в контроллере отдыха Spring?

Имея следующий код:

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

Аргумент String json всегда равен нулю, несмотря на то, что json отправляется в тело.

Примечание, что я не хочу автоматического преобразования типов, мне просто нужен простой результат json.

Это, например, работает:

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

Возможно, я могу использовать использование параметра ServletRequest или InputStream в качестве аргумента для получения фактического тела, но мне интересно, есть ли более простой способ?

Ответ 1

Лучший способ, который я нашел до сих пор:

@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

Сообщите мне, есть ли другие альтернативы.

Ответ 2

Вы можете просто использовать

@RequestBody String pBody

Ответ 3

У меня работал только HttpServletRequest. HttpEntity дал пустую строку.

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!";
}

Ответ 4

Самый простой способ, который работает для меня, -

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