spring-mvcのJavaオブジェクトにJSONを解析します
-
29-09-2019 - |
質問
私は私からJSONを返す方法に精通しています @Controller
を使用した方法 @ResponseBody
注釈。
今、私は私のコントローラーにJSONの議論を読もうとしていますが、これまでのところ運がありませんでした。これが私のコントローラーの署名です:
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") @RequestBody SearchRequest json) {
しかし、私がこの方法を呼び出しようとすると、Springはそれを不満を言います。Failed to convert value of type 'java.lang.String' to required type 'com.foo.SearchRequest'
削除 @RequestBody
注釈は違いを生むようです。
JSONの作品を手動で解析するので、ジャクソンはクラスパスにいる必要があります。
// This works
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") String json) {
SearchRequest request;
try {
request = objectMapper.readValue(json, SearchRequest.class);
} catch (IOException e) {
throw new IllegalArgumentException("Couldn't parse json into a search request", e);
}
何か案は?サポートされていないことをしようとしていますか?
解決
パラメーターはaにする必要があります @RequestParam
, また a @RequestBody
, 、両方ではありません。
@RequestBody
リクエストの本文があなたが解析したいものである場合、投稿とリクエストを使用するためです。 @RequestParam
URLまたはマルチパートフォームの提出のいずれかで、指名されたパラメーター用です。
したがって、必要なものを決定する必要があります。あなたは本当にあなたのJSONをリクエストパラメーターとして持ちたいですか?これは通常、Ajaxの仕組みではなく、通常はリクエスト本体として送信されます。
削除してみてください @RequestParam
そして、それが機能するかどうかを確認します。そうでない場合、そしてあなたは本当にJSONをリクエストパラメーターとして投稿していますが、Springは追加の配管なしでそれを処理するのに役立ちません(参照 WebDataBinderの初期化のカスタマイズ).
他のヒント
あなたがクライアント側でjQueryを使用している場合、これは私のために働きました:
Java:
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestBody SearchRequest json) {
jQuery(json.stringify関数を持つには、ダグラスクロックフォードのjson2.jsを含める必要があります):
$.ajax({
type: "post",
url: "sync", //your valid url
contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
data: JSON.stringify(jsonobject), //json object or array of json objects
success: function(result) {
//do nothing
},
error: function(){
alert('failure');
}
});