2016-05-23 13 views
0


Spring RESTful WebServiceでJSONObjectsを返すことに疑問があります。Spring RESTful Webservice - モデルオブジェクトなしでJSONを返す

ここにあります:
JSONObjectを返すようにしたいコントローラのメソッドがあります。

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type: class org.json.JSONObject 

だから、私は実際にそれが何を意味するかを理解し、そして私はその問題に答えを検索してきた。私はそれがJSONObjectへのリターンタイプだと効果的JSONObjectを返す設定した場合しかし、私は、エラー、次のことを得ます少なくとも3日間。

は、ここに私のコードです:

@RequestMapping(value = "/value", method = RequestMethod.POST) 
public String method(HttpServletRequest request) { 
    JSONObject json = new JSONObject(); 
    json.put("example", "example message"); 

    return json.toString(); 
} 

私は(外部アプリケーションであることを行っている)フロントエンドでそれを消費する必要があるときには、働くつもりだ場合、私はtrully知りません。 true JSONObjectを返さなければなりませんか? JSONObject.toString()を返すとうまくいくはずですか?

最後のもの:
JSONObjectを返すチュートリアルのほとんどは、使用したくないモデルオブジェクトを使用してそのプロセスを教えています。モデルオブジェクトを使用せずにこれを行う方法はありますか?

ありがとうございました!

+0

失敗コードを表示します。 '@ ResponseBody'で' JSONObject'に問題があったメソッドにアノテーションを付けましたか? – chrylis

+0

私はまた、あなたが不必要なトラブルに行くことに気付くでしょう。この場合、Map を返すだけで、うまく動作し、複雑さは軽減されます。 – chrylis

+0

@chrylisいいえ、実際は私のコントローラは '@ RestController'なので、メソッドに' @ ResponseBody'(右?)を付ける必要はありません。だから、JSONを返すようにしたいのですが、私はJQuery(おそらくAJAX)を使って自分のアクションに投稿した後にそのレスポンスを消費する予定です。 –

答えて

0

@ResponseBodyでメソッドに注釈を付けるだけです。

0

クラス注釈を@RestControllerに変更し、モデルオブジェクトまたはMap<String, Object>を返します。あなたは仕事のためにJSONObjectを混乱させる必要はありません。 akhillのように、メソッドのすべてのコントローラがRESTの場合は冗長でもOKです。

+0

Mapを返すことに関する大きな問題は、私のロジック全体がJSONObjectsとして実装されていることです。また、いくつかのJSONArrayも使用しています。私は '@ RestController'として注釈を付けたコントローラを持っています。私はjson.toString()を返すかどうか知っていますか?JSONとしてフロントエンドでそれを消費することはできますか? –

+0

フロントエンドでJSONの構築方法を気にする理由は何ですか?それはとにかくテキストとして終わる!ここで唯一考えられるのは、MIMEタイプです。この投稿は役に立ちそうです:http://stackoverflow.com/questions/3616359/who-sets-response-content-type-in​​-spring-mvc-responsebody –

+0

ここまでのおかげでありがとうございます。つまり、あなたが言ったことに基づいて、プレーンテキスト、つまり、バックエンドで生成されたJSONを表す '{" name ":" Your name "}'という文字列を返すと、私はまだフロントエンドでJSONとして消費しますか?私はすでにブラウザに文字列レスポンスをレンダリングすることができますが、問題は次のとおりです。私はそれを消費する方法を見つけることができません。 –

0

マッピング用にジャクソンを使用している場合、代わりにObjectNodeを返すことができます。これはJacksonのjsonオブジェクトの表現です。 ArrayNodeクラスもあります。独自の実装を使用する場合は、HttpMessageConverterと記述してjsonの読み書きを可能にするか、実際にjson文字列を返す場合はtoStringメソッドを使用してください。

+0

JSON Stringを返すことで、フロントエンド上でJSONストリングを正常に使用できるようになりますか? –

1

私は同じ問題があり、その解決策は信じられないほど簡単です。

JSONObjectを作成した後、返信したい場合は、単にreturn jsonObject.toMap()と書いてください。ジャクソンは残りの作業を行います。次のようにしてください。メソッドの戻り値の型をMap<String, Object>に変更し、メソッドに@ResponseBody、クラス全体に@RestControllerという適切な注釈を適用することを忘れないでください。それはあなたのニーズに依存します。あなたのケースでは

それは次のようになります。

@RequestMapping(value = "/value", method = RequestMethod.POST) 
public @ResponseBody Map<String, Object> method(HttpServletRequest request) { 
    JSONObject json = new JSONObject(); 
    json.put("example", "example message"); 

    return json.toMap(); 
} 
関連する問題