@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
8
在下面的代码中,我将向您展示 @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
}
}
11 回答
@Controller
用于将类标记为Spring MVC Controller .@RestController
是一个便利注释,除了添加@Controller
和@ResponseBody
注释之外什么也没做(参见:Javadoc)因此,以下两个控制器定义应该相同
在下面的代码中,我将向您展示
@controller
之间的区别和
@RestController
@ResponseBody
默认激活 . 您无需将其添加到函数签名上方 .@RestController
带注释的类与@Controller
相同,但处理器方法的@ResponseBody
是隐含的 .实际上,要小心 - 它们并不完全相同 .
如果在应用程序中定义任何拦截器,它们将不会应用于注释为
@RestController
的控制器,但它们可以与@Controller
带注释的控制器一起使用 .即 . 拦截器的配置:
并在Spring控制器的声明中:
然而,会工作
最终不会让拦截器与它相关联 .
如果使用@RestController,则无法返回视图(在Spring / springboot中使用Viewresolver),在这种情况下不需要@ResponseBody .
如果使用@controller,则可以在Spring webMVC中返回一个视图 .
正如您在Spring文档中看到的那样(Spring RestController Documentation)Rest Controller注释与Controller注释相同,但假设默认情况下@ResponseBody处于活动状态,因此所有json都被解析为java对象 .
Spring4中新的@RestController注释,它将类标记为控制器,其中每个方法都返回一个域对象而不是视图 . 这是@Controller和@ResponseBody合作的简写 .
@RestController
自Spring 4.0.1开始提供 . These controllers表示此处@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 }
@ResponseBody
被视为MVC中的视图,它被直接调度而不是从Dispatcher Servlet调度,并且相应的转换器以相关格式转换响应,如text / html,application / xml,application / json .但是,Restcontroller已经与ResponseBody和相应的转换器耦合 . 其次,这里,由于不是转换响应体,而是自动转换为http响应 .
@Controller
:此注释只是@Component
的专用版本,它允许基于类路径扫描自动检测控制器类 .@RestController
:此注释是@Controller
的专用版本,它自动添加@Controller
和@ResponseBody
注释,因此我们不必将@ResponseBody
添加到我们的映射方法中 .@RestController
是@Controller
和@ResponseBody
的组合,如果我们在Method签名中没有使用@ResponseBody
那么我们需要使用@Restcontroller
.@RestController不是使用@Controller和@ResponseBody,而是在Spring 4.0及更高版本中公开Rest API .