web-dev-qa-db-ja.com

Spring Rest ControllerでプレーンJSONボディにアクセスする方法は?

次のコードを持つ:

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

本文のjsonが送信されるにもかかわらず、String json引数は常にnullです。

私は自動型変換を望まず、単純な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を引数として使用して実際の本文を取得することができますが、もっと簡単な方法があるのでしょうか?

35
Marcel Overdijk

私が今まで見つけた最良の方法は次のとおりです。

@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

他の選択肢があれば教えてください。

63
Marcel Overdijk

あなただけを使用することができます

@RequestBody String pBody

14
aGO

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

私のために働く最も簡単な方法は

@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