回答:
@Controller クラスをSpring MVCコントローラーとしてマークするために使用されます。@RestController@Controllerand @ResponseBodyアノテーションを追加するだけの便利なアノテーションです(Javadocを参照)。したがって、次の2つのコントローラー定義は同じようにする必要があります
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleafすると、この注釈に含まれている@RestControllerため、機能しません@ResponseBody。
@ResponseBody返されたオブジェクトを、JSONまたはXML(ソース)などの本文に含めることができるものにします
以下のコードで、両者の違いを示します @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する場合、ビューを返すことはできず(ViewresolverSpring / springbootで使用することにより)@ResponseBody、この場合はyes は必要ありません。
使用する@Controller場合は、Spring Web MVCでビューを返すことができます。
@RestControllerアノテーション付きのクラスは同じです@Controllerが@ResponseBody、ハンドラーメソッドのonが暗黙指定されます。
実際には、注意してください-それらは完全に同じではありません。
アプリケーション内でインターセプターを定義した場合、インターセプターはとして注釈が付けられたコントローラーには適用されませんが、注釈が付けられたコントローラー@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 {...
インターセプターが関連付けられることにはなりません。
@RestControllerSpring 4xで導入されました。このアノテーションは、それ自体もアノテーションが付けられている@Controllerため、機能しない場合@Controllerはバグとして報告します。
Interceptorに@RestController。
Interceptorました@RestController。
Springドキュメント(Spring RestControllerドキュメント)でわかるように、Rest ControllerアノテーションはControllerアノテーションと同じですが、@ ResponseBodyがデフォルトでアクティブであるため、すべてのjsonはJavaオブジェクトに解析されます。
@RestControllerSpring 4.0.1以降で提供されました。これらのコントローラーは、ここでは@RequestMappingメソッドがデフォルトで@ResponseBodyセマンティクスを想定していることを示しています。
以前のバージョンでは、以下を使用して同様の機能を実現できました。
@RequestMapping結合された@ResponseBodyような@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/> JacksonまたはxmlでJSONを使用する方法の1つとして使用できます。
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@ResponseBody ここではMVC内のビューとして扱われ、Dispatcherサーブレットからディスパッチされる代わりに直接ディスパッチされ、それぞれのコンバーターがtext / html、application / xml、application / jsonなどの関連フォーマットに応答を変換します。ただし、Restcontrollerは既にResponseBodyとそれぞれのコンバーターに結合されています。次に、ここでは、responsebodyを変換する代わりに、自動的にhttp応答に変換されます。
@Controller:このアノテーションはの特別なバージョンで@Componentあり、クラスパススキャンに基づいてコントローラークラスを自動検出できるようにします。@RestController:この注釈は特殊なバージョンで@Controllerあり@Controller、@ResponseBody自動的に注釈が追加さ@ResponseBodyれるため、マッピングメソッドに追加する必要はありません。@RestControllerで@Controllerと@ResponseBodyを使用する代わりに、Spring 4.0以降でRest APIを公開しましょう。