Springの@Controller
と@RestController
アノテーションの違い。
Web MVCアプリケーションとRESTアプリケーションの両方に@Controller
アノテーションを使用できますか?
そうであれば、それがWeb MVCなのかRESTアプリケーションなのかをどうやって区別することができますか。
@Controller
は、クラスをSpring MVCコントローラとしてマークするために使用されます。@RestController
は、@Controller
および@ResponseBody
アノテーションを追加する以外の何もしない便利なアノテーションです( Javadoc を参照)したがって、次の2つのコントローラ定義は同じことをするはずです
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
以下のコードで、@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
が暗黙的に含まれています。
@RestController
を使用すると(Spring/springbootでViewresolver
を使用することで)ビューを返すことができず、はい@ResponseBody
はこの場合必要ありません。
@Controller
を使用すると、Spring Web MVCでビューを返すことができます。
実際には、注意してください - それらはまったく同じではありません。
アプリケーション内でインターセプターを定義した場合、それらは@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 {...
インターセプターが関連付けられていることにはなりません。
Springのドキュメントに見られるように( Spring RestController Documentation )Rest ControllerアノテーションはControllerアノテーションと同じですが、デフォルトで@ResponseBodyがアクティブであると仮定するので、すべてのjsonはJavaオブジェクトに解析されます。
Spring4 +の新しい@RestControllerアノテーション。すべてのメソッドがビューではなくドメインオブジェクトを返すコントローラとしてクラスをマークします。 @Controllerと@ResponseBodyが一緒になったことの省略形です。
@RestController
はSpring 4.0.1から提供されています。 これらのコントローラ ここで@RequestMappingメソッドはデフォルトで@ResponseBodyセマンティクスを仮定していることを示します。
以前のバージョンでは、以下を使用して同様の機能を実現できました。
@RequestMapping
を@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }
のように@ResponseBody
と結合
<mvc:annotation-driven/>
は、JacksonまたはxmlでJSONを使用する方法の1つとして使用できます。
@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }
@ResponseBody
がビューとして扱われ、Dispatcher Servletからディスパッチされる代わりに直接ディスパッチされ、それぞれのコンバーターはtext/html、application/xml、application/jsonのような関連フォーマットで応答を変換します。ただし、RestcontrollerはResponseBodyおよびそれぞれのコンバーターとすでに結合されています。次に、ここでは、レスポンスボディを変換する代わりに、自動的にhttpレスポンスに変換されます。
@Controller
はView
を返します。 @RestController
はResponseBody
を返します。
@Controller
:このアノテーションは@Component
の特殊バージョンであり、クラスパススキャンに基づいてコントローラクラスを自動検出することができます。@RestController
:このアノテーションは、@Controller
および@Controller
アノテーションを自動的に追加する特殊なバージョンの@ResponseBody
なので、マッピングメソッドに@ResponseBody
を追加する必要はありません。