問題:spring里面 @Controller和@RestController注解的區別
spring里面 @Controller和@RestController注解的區別
Web MVC和REST applications都可以用@Controller嗎?
如果是的話,怎么樣區別這個一個 Web MVC還是REST application呢
回答一
下面的代碼向你展示了@controller和 @RestController的區別
@Controller
public class RestClassName{@RequestMapping(value={"/uri"})@ResponseBodypublic ObjectResponse functionRestName(){//...return instance}
}
@RestController
public class RestClassName{@RequestMapping(value={"/uri"})public ObjectResponse functionRestName(){//...return instance}
}
@ResponseBody 在缺省的情況下會被激活. 你不需要在方法聲明那里加上。
回答二
- @Controller 用于標記類是 Spring MVC Controller
- @RestController是一種加上了@Controller和@ResponseBody的便捷注解(請看Javadoc)
所以下面定義的兩個controller應該是一樣的
@Controller
@ResponseBody
public class MyController { }@RestController
public class MyRestController { }
回答三
事實上,小心點,它們不是完全相同的
如果你的應用程序定義了任何interceptors,它們就不能作用在 注解了@RestController的Controllers 上,但是他們對于標注了@Controller的controller還是起作用的。
攔截器的配置:
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");}}
聲明一個 Spring controller:
@Controller
public class AdminServiceController {...
Will work, however@RestController
public class AdminServiceController {...
最終就沒有攔截器和它關聯了
回答四
正如你在Spring文檔(Spring RestController documentation)中看到的,RestController注解與Controller注解相同,但是@ResponseBody默認是生效的,因此所有Java對象在響應體中都被序列化為JSON格式。
回答五
Spring4以上版本中的新注解@RestController將類標記為一個controller,其中每個方法返回一個對象而不是一個視圖。它是@Controller和@ResponseBody結合在一起的的縮寫。
文章翻譯自Stack Overflow:https://stackoverflow.com/questions/25242321/difference-between-spring-controller-and-restcontroller-annotation