Spring Boot にサンプルの RestController があります:
@RestController
@RequestMapping("/api")
class MyRestController
{
@GetMapping(path = "/hello")
public JSONObject sayHello()
{
return new JSONObject("{'aa':'bb'}");
}
}
JSONライブラリを使用していますorg.json
API を押すと/hello
、次のような例外が発生します:
パス [] のコンテキストのサーブレット [dispatcherServlet] の Servlet.service() が例外 [リクエスト処理に失敗しました。ネストされた例外は java.lang.IllegalArgumentException: 戻り値の型に対するコンバーターが見つかりません: クラス org.json.JSONObject] をスローしました。根本的な原因
java.lang.IllegalArgumentException: 戻り値の型に対応するコンバーターが見つかりません: クラス org.json.JSONObject
問題は何ですか? 何が起こっているのか正確に説明してくれる人はいますか?
ベストアンサー1
Spring Boot Web を使用しているため、Jackson の依存関係は暗黙的であり、明示的に定義する必要はありません。Eclipse をpom.xml
使用している場合は、依存関係階層タブで Jackson の依存関係を確認できます。
また、 で注釈を付けたので、@RestController
明示的な json 変換を行う必要はありません。 POJO を返すだけで、jackson シリアライザーが json への変換を処理します。 これは、@Controller で使用する場合と同じです。すべてのコントローラー メソッドに@ResponseBody
配置するのではなく、バニラの代わりに を配置し、デフォルトでそのコントローラーのすべてのリソースに適用されます。@ResponseBody
@RestController
@Controller
@ResponseBody
このリンクを参照してください: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody
あなたが直面している問題は、返されたオブジェクト (JSONObject) に特定のプロパティのゲッターがないことです。また、あなたの意図はこの JSONObject をシリアル化することではなく、POJO をシリアル化することです。したがって、POJO を返すだけです。
このリンクを参照してください: https://stackoverflow.com/a/35822500/5039001
JSON シリアル化された文字列を返す場合は、文字列を返すだけです。この場合、Spring は JSON コンバーターではなく StringHttpMessageConverter を使用します。