Answers:
@Controller
用于将类标记为Spring MVC Controller。@RestController
是一个方便的批注,除了添加@Controller
和@ResponseBody
批注外没有其他作用(请参阅:Javadoc)所以以下两个控制器定义应该做的一样
@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
在这种情况下不需要。
如果使用@Controller
,则可以在Spring Web MVC中返回视图。
@RestController
带注释的类与相同,@Controller
但@ResponseBody
暗含处理程序方法。
实际上,要小心-它们并不完全相同。
如果您在应用程序中定义任何拦截器,则它们将不适用于注释为的Controller @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
然后报告这个bug。
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/>
可以用作将JSON与Jackson或xml一起使用的方法之一。
@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响应。
在Spring 4.0中引入了@RestController注释,以简化RESTful Web服务的创建。这是一个方便的批注,将@Controller和@ResponseBody结合在一起–无需使用@ResponseBody批注来注释控制器类的每个请求处理方法。
@Controller
:此注释只是其的专用版本,@Component
它允许基于类路径扫描自动检测控制器类。@RestController
:此注释是一个专用版本@Controller
,会自动添加@Controller
和@ResponseBody
注释,因此我们不必@ResponseBody
在映射方法中添加。@Controller用于使用JSP的旧系统中。它可以返回视图。@RestController用来标记控制器正在提供JSON响应类型的REST服务。因此它将@Controller和@ResponseBody批注包装在一起。
@RestController不是使用@Controller和@ResponseBody,而是让您在Spring 4.0及更高版本中公开Rest API。