spring @Controller和@RestController注释的区别

spring @Controller@RestController注释的@RestController

Web MVC和REST应用程序都可以使用@Controller注释吗?
如果是的话,如果是Web MVC或REST应用程序,我们该如何区分呢?

  • @Controller用于将类标记为Spring MVC Controller。
  • @RestController是一个方便的注释,只不过是添加了@Controller@ResponseBody注解(参见: Javadoc )

所以下面两个控制器定义应该做同样的事情

 @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是隐含的。

正如你可以在Spring文档( Spring RestController Documentation )中看到的那样,Rest Controller注释与Controller注解相同,但是默认情况下@ResponseBody是活动的,所以所有的json都被parsing为java对象。

其实要小心 – 它们不完全一样。

如果在应用程序中定义了任何拦截器,它们将不适用于注释为@RestController控制器,但是它们可以使用@Controller注释的控制器。

即。 拦截器的configuration:

 @Configuration public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**"); } } 

并在春季控制器的声明:

 @Controller public class AdminServiceController {... 

将工作,但是

 @RestController public class AdminServiceController {... 

拦截器并没有被关联。

如果你使用@RestController你不能返回一个视图(通过在Spring / springboot中使用Viewresolver),在这种情况下是不需要@ResponseBody的。

如果你使用@controller,你可以在Spring webMVC中返回一个视图。

Spring4 +中的新的@RestController注解,它将类标记为一个控制器,其中每个方法都返回一个域对象而不是一个视图。 这是@Controller和@ResponseBody的缩写。

从Spring 4.0.1 @RestController ,提供了@RestController 。 这些控制器表明这里的@RequestMapping方法默认采用@ResponseBody语义。

在以前的版本中,可以通过使用下面的方式来实现类似的功

  1. @RequestMapping@ResponseBody@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. 可以使用<mvc:annotation-driven/>作为与Jackson或xml一起使用JSON的方法之一。

  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和相应的转换器相连接。 其次,在这里,由于不是转换responsebody,而是自动转换为http响应。

@RestController@Controller@ResponseBody组合,如果我们没有在方法签名中使用@ResponseBody ,那么我们需要使用@Restcontroller

而不是使用@Controller和@ResponseBody,@RestController让你在Spring 4.0及更高版本中公开Rest API。