回答:
@Controller
クラスをSpring MVCコントローラーとしてマークするために使用されます。@RestController
@Controller
and @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
する場合、ビューを返すことはできず(Viewresolver
Spring / 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 {...
インターセプターが関連付けられることにはなりません。
@RestController
Spring 4xで導入されました。このアノテーションは、それ自体もアノテーションが付けられている@Controller
ため、機能しない場合@Controller
はバグとして報告します。
Interceptor
に@RestController
。
Interceptor
ました@RestController
。
Springドキュメント(Spring RestControllerドキュメント)でわかるように、Rest ControllerアノテーションはControllerアノテーションと同じですが、@ ResponseBodyがデフォルトでアクティブであるため、すべてのjsonはJavaオブジェクトに解析されます。
@RestController
Spring 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を公開しましょう。