web-dev-qa-db-ja.com

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

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

Web MVCアプリケーションとRESTアプリケーションの両方に@Controllerアノテーションを使用できますか?
そうであれば、それがWeb MVCなのかRESTアプリケーションなのかをどうやって区別することができますか。

295
Srikanth
  • @Controllerは、クラスをSpring MVCコントローラとしてマークするために使用されます。
  • @RestControllerは、@Controllerおよび@ResponseBodyアノテーションを追加する以外の何もしない便利なアノテーションです( Javadoc を参照)

したがって、次の2つのコントローラ定義は同じことをするはずです

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }
418
micha

以下のコードで、@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はデフォルトで有効になっています。関数シグネチャの上に追加する必要はありません。

@RestControllerアノテーション付きクラスは@Controllerと同じですが、ハンドラーメソッドの@ResponseBodyが暗黙的に含まれています。

18
Bart

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

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

15
Ravi Wadje

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

アプリケーション内でインターセプターを定義した場合、それらは@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 {...

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

12
bertybro

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

8
CAAY

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

4
yancy

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

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

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

  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. ここではMVCの中で@ResponseBodyがビューとして扱われ、Dispatcher Servletからディスパッチされる代わりに直接ディスパッチされ、それぞれのコンバーターはtext/html、application/xml、application/jsonのような関連フォーマットで応答を変換します。

ただし、RestcontrollerはResponseBodyおよびそれぞれのコンバーターとすでに結合されています。次に、ここでは、レスポンスボディを変換する代わりに、自動的にhttpレスポンスに変換されます。

2
hi.nitish

@ControllerViewを返します。 @RestControllerResponseBodyを返します。

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