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语义。
在以前的版本中,可以通过使用下面的方式来实现类似的功
-
@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的方法之一。 - MyBean可以这样定义
@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }
- 在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。
- 根据.properties文件中的属性导入Springconfiguration文件
- 如何防止Spring 3.0 MVC @ModelAttributevariables出现在URL中?
- Spring Java Config:如何用运行时参数创build一个原型范围的@Bean?
- 在多个项目/模块中使用多个属性文件(通过PropertyPlaceholderConfigurer)
- @RequestParam vs @PathVariable
- 如何在绑定spring mvc命令对象时自定义参数名称
- 解释为什么构造函数注入比其他选项更好
- 在父上下文中声明Spring Bean与子上下文
- 在@RequestParam中绑定列表