Spring @Controllerと@RestControllerアノテーションの違い


357

ばね@Controller@RestController注釈の違い。

@ControllerアノテーションはWeb MVCとRESTアプリケーションの両方に使用できますか?
はいの場合、それがWeb MVCであるかRESTアプリケーションであるかをどのように区別できますか?

回答:


471
  • @Controller クラスをSpring MVCコントローラーとしてマークするために使用されます。
  • @RestController@Controllerand @ResponseBodyアノテーションを追加するだけの便利なアノテーションです(Javadocを参照)。

したがって、次の2つのコントローラー定義は同じようにする必要があります

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
@RestControllerも応答をJSON / XMLに自動的に変換すると思います。
arnabkaycee

1
違いを説明するSpringチュートリアルへのリンクを共有するだけですspring.io/guides/gs/rest-service
Mina Samy

9
また、このようなテンプレートエンジンを使用Thymeleafすると、この注釈に含まれている@RestControllerため、機能しません@ResponseBody
Sonique

3
@ResponseBody返されたオブジェクトを、JSONまたはXML(ソース)などの本文に含めることができるものにします
Martin Thoma

59

以下のコードで、両者の違いを示します @controller

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

そして @RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

これ @ResponseBodyはデフォルトでアクティブになっています。関数のシグネチャの上に追加する必要はありません。


1
Javaのクラス名は、大文字で始める必要があります。つまり、RestClassName(restClassNameではありません)。
Razzle、

24

使用@RestControllerする場合、ビューを返すことはできず(ViewresolverSpring / springbootで使用することにより)@ResponseBody、この場合はyes は必要ありません。

使用する@Controller場合は、Spring Web MVCでビューを返すことができます。


はい、@ ResponseBodyはメソッドに置くことができ、戻り値の型をHTTP応答の本文に直接書き込む必要があることを示します(モデルに配置したり、ビュー名として解釈したりしないでください)
PraveenKumar Lalasangi


14

実際には、注意してください-それらは完全に同じではありません。

アプリケーション内でインターセプターを定義した場合、インターセプターはとして注釈が付けられたコントローラーには適用されませんが、注釈が付けられたコントローラー@RestControllerでは機能し@Controllerます。

すなわち。インターセプターの構成:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
    }

}

そしてSpringコントローラの宣言で:

@Controller
public class AdminServiceController {...

ただし、機能します

@RestController
public class AdminServiceController {...

インターセプターが関連付けられることにはなりません。


2
@RestControllerSpring 4xで導入されました。このアノテーションは、それ自体もアノテーションが付けられている@Controllerため、機能しない場合@Controllerはバグとして報告します。
gaoagong、2015年

@bertybro、それは正しくありません。あなたは関連付けることができますInterceptor@RestController
Ravi-A-Doer 2017

私は確かににうまくアタッチしInterceptorました@RestController
ベンバーデン

11

Springドキュメント(Spring RestControllerドキュメント)でわかるように、Rest ControllerアノテーションはControllerアノテーションと同じですが、@ ResponseBodyがデフォルトでアクティブであるため、すべてのjsonはJavaオブジェクトに解析されます。


4

Spring4 +の新しい@RestControllerアノテーション。クラスをコントローラーとしてマークし、すべてのメソッドがビューではなくドメインオブジェクトを返します。これは、@ Controllerと@ResponseBodyを合わせたものの省略形です。


3

@RestControllerSpring 4.0.1以降で提供されました。これらのコントローラーは、ここでは@RequestMappingメソッドがデフォルトで@ResponseBodyセマンティクスを想定していることを示しています。

以前のバージョンでは、以下を使用して同様の機能を実現できました。

  1. @RequestMapping結合された@ResponseBodyような@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> JacksonまたはxmlでJSONを使用する方法の1つとして使用できます。

  3. MyBeanは次のように定義できます。

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

  1. @ResponseBody ここではMVC内のビューとして扱われ、Dispatcherサーブレットからディスパッチされる代わりに直接ディスパッチされ、それぞれのコンバーターがtext / html、application / xml、application / jsonなどの関連フォーマットに応答を変換します。

ただし、Restcontrollerは既にResponseBodyとそれぞれのコンバーターに結合されています。次に、ここでは、responsebodyを変換する代わりに、自動的にhttp応答に変換されます。


2

@Controllerを返しますView@RestControllerを返しますResponseBody


2
あなたはもっと説明する必要があります。これはどのように質問に答えますか?
ユンノシュ

@Yunnosch 'view'は、jspやhtmlのようなフロントエンドです。ResponseBodyはxml、json、yamlにすることができます
G.Brown

役立つ情報を追加するには、回答を編集してください。しかし、私はまだそれが質問にどう答えるべきかわかりません。「……できるから/できないから……」のように説明してもらえますか?
ユンノシュ

1

@RestControllerアノテーションは、RESTful Webサービスの作成を簡素化するためにSpring 4.0で導入されました。これは、@ Controllerと@ResponseBodyを組み合わせた便利なアノテーションです。これにより、コントローラクラスのすべてのリクエスト処理メソッドに@ResponseBodyアノテーションを付ける必要がなくなります。


0
  • @Controller:このアノテーションはの特別なバージョンで@Componentあり、クラスパススキャンに基づいてコントローラークラスを自動検出できるようにします。
  • @RestController:この注釈は特殊なバージョンで@Controllerあり@Controller@ResponseBody自動的に注釈が追加さ@ResponseBodyれるため、マッピングメソッドに追加する必要はありません。

0

@Controllerは、JSPを使用するレガシーシステムで使用されます。ビューを返すことができます。@RestControllerは、コントローラーがJSON応答タイプのRESTサービスを提供していることをマークするためのものです。@Controllerと@ResponseBodyアノテーションを一緒にラップします。


-3

@RestController組成物である@Controller@ResponseBody我々が使用していない場合は、@ResponseBodyメソッド内の署名をし、我々が使用する必要があります@Restcontroller


-3

@RestControllerで@Controllerと@ResponseBodyを使用する代わりに、Spring 4.0以降でRest APIを公開しましょう。


あなたは言いたい、私は@RestControllerも自動的にJSON / XMLへの応答を変換と思います。?あなたはそれを明確に説明する代わりに抽象的な文章を使用しました、私はそれをお勧めしません。
cinqS 2017年

考えてみると、@ ControllerはJSON / XMLなどのMIMEタイプを生成および消費するのと同じことを行います... @ ResponseBodyは、Viewを生成せずにRESTエンドポイントのように動作するようにコントローラーに指示します。RestControllerは暗黙的にそれを行います。
CoffeeBeanie 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.