http://javarevisited.blogspot.jp/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html を読んだ。実はspringよく知らずに使っている。
Difference between @RestController and @Controller Annotation in Spring MVC and REST
Spring MVCの@RestController
アノテーションは@Controller
と@ResponseBody
を組み合わせたものです。子のアノテーションはSpring 4.0で追加されたもので、RESTfulなWebサービスの開発をしやすくするためのものです。REST web servicesを既に知っているのであれば、webアプリケーションとREST APIの違いについても知っているかと思います。前者のwebアプリケーションのレスポンスは基本的にはビュー(HTML + CSS + JavaScript)である一方、後者のREST APIはJSONやXML形式のデータのみ返します。これらの相違点は@Controller
と@RestController
でも同様です。@Controller
の役割はモデルオブジェクトのMapの生成とビューの参照で、@RestController
は単にオブジェクトを返し、オブジェクトデータはHTTPレスポンスにJSONやXML形式で直接書き込まれます。
これまで通りのやり方である@Controller
と@ResponseBody
で同じことが出来ますが、この動作はRESTful Webサービスのデフォルトの振る舞いです。そのため、Springは@Controller
と@ResponseBody
の振る舞いを組み合わせた@RestController
を導入しました。
つまり、以下の二つのコードはSpring MVCでは等価です。
@Controller @ResponseBody public class MVCController { .. your logic }
@RestController public class RestFulController { .... your logic }
当然ながら、アノテーションを2個よりも1個の方が好まれます。また、@RestController
の方が意図が明瞭です。
What are @Controller and @RestController in Spring?
Springフレームワークでは、Controllerのクラスはビューで表示するデータをモデルMapを構築すると共に正しいビューを選択する役割を担います。なお、@ResponseBody
アノテーションでレスポンスのストリームに直接書き込んでリクエストを完了することも可能です。
レスポンスストリームに直接書き込む動作はRESTful Webサービス呼び出しに対する責務にマッチしており、この場合は以前のエントリhow Spring MVC works internallyで述べたようにビューを返す代わりにデータを返したいからです。
Spring 3もしくはSpring 3.1などSpring 4以前でRESTful Webサービスを開発していた場合、RESTfulなレスポンスの生成に@Controller
と@ResponseBody
の組み合わせを使用していたかと思われます。Springの開発者はこの課題を認識していたので@RestController
を作成しました。
よって@Controller
と@RestponseBody
を使う必要は無くなり、同様なことを実現するには@RestController
を使えば良くなりました。つまり、このアノテーションは@Controler
と@Response
ボディの振る舞いを一つにまとめた簡易化コントローラー、ということです。
SpringのRESTFul Webサービスの高度なテクニックに関心があればEugen Paraschiv氏のREST with Spring Master classを購入してみてください。
Difference between @RestController and @Controller in Spring
@RestController
と@Controler
のアノテーションを既に使ったことがあるのであれば、両者の違いを見ておくと良いです。採用面接の点ではなくSpring CoreおよびSpring Web Application developer Certificationの点で重要です。Spring certificationsを受ける場合、これらの微妙な違いを知っておくと良いです。また、フリーのSpringテストで試験形式と問題のレベルを見ておくのも良いでしょう。
ともあれ相違点の話に戻ると、両アノテーションには大きな違いがあります。
1.@Controller
はSpring MVCのContollerとしてクラスを作成するための一般的なアノテーションですが、@RestController
はRESTFul web servicesのための専用コントローラーで@Controller + @ResponseBodyと等価です。
2.@RestController
は比較的新しいもので、Spring 4.0から追加されたものですが@Controller
はSpringがアノテーションをサポートし始めた古くから存在するもので、正式にはSpring 2.5バージョンから追加されています。
3.@Controller
はそのクラスが"Controller"、例えばwebコントローラー、であることを示す一方、@RestController
はそのクラスが、@RequestMapping
のメソッドがデフォルトで@ResponseBody
を返すと想定されるコントローラ、つまりREST API、を示します。
4.@Controller
は@Component
を専用化したもので、@RestController
は@Controller
を専用化したものです。実際には以下のように@Controller
と@ResponseBody
による簡易化コントローラーとなっています。
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Controller @ResponseBody public @interface RestController
@Controller
の宣言は以下のようになっています。
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Controller
5.Spring MVCの@Controler
と@RestCotroller
の主要な相違の一つは、クラスに@RestController
を付与するとそのすべてのメソッドはビューではなくドメインオブジェクトが書き込まれます*1。Springベースのアプリケーションで@RestControllerを使う方法のより詳しい方法についてはBryan Hassen氏のIntroduction to Spring MVC 4を参照してください。
6.@Controler
と@RestCotroller
のもう一つの違いは、以下のように@RestController
をクラスに付与する場合はすべてのハンドラメソッドに@ResponseBody
を付ける必要が無い点です。
with @RestControler
@RestController public class Book{ @RequestMapping(value={"/book"}) public Book getBook(){ //... return book; } }
without @RestController
@Controller public class Book{ @RequestMapping(value={"/book"}) @ResponseBody public Book getBook(){ //... return book; } }
RESTful responseを作成するのにSpring MVCの@Controller
を使うと分かるのですが、個々のメソッドに@ResponseBody
を付ける必要があり、@RestController
ではその必要がありません。読みやすさは元よりキーを押す回数も減らせます。
SpringBootと@RestController
で作成したHelloWorldサンプルは以下になります。
以上がSpring MVCの@Controller
と@RestController
の違いになります。@RestControllerは単に@Controllerと@ResponseBodyを組み合わせたものです。
SpringフレームワークでRESTfulなwebサービスを作りやすくする意図で、Spring 4でこのアノテーションは追加されました。リクエストのMIMEタイプに応じてレスポンスをJSONやXMLに直接変換します。
このため、 RESTful Web Servicesを作るには@Controller
に@ResponseBody
を付けるよりも@RestController
を使う方が良いです。
SpringとSpring SecurityフレームワークでRESTful Web Servicesを開発する場合の詳細を学ぶには、Eugen Paraschiv氏のREST with Spring Coaching classの購入を推奨します。EugenはJavaでのセキュアなRESTful webサービスと実際の開発経験を持っているので、この教材は彼の経験から得られた知識を学ぶには良い機会となっています。