質問

私は私から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');
    }
});
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top