弹簧@Controller
和@RestController
注释之间的区别。
可以将@Controller
注释用于Web MVC和REST应用程序吗?
如果是,我们如何区分它是Web MVC还是REST应用程序。
答案 0 :(得分:420)
@Controller
用于将类标记为Spring MVC Controller。@RestController
是一个便捷注释,除了添加@Controller
和@ResponseBody
注释外,其他功能只有一个(参见:Javadoc)所以以下两个控制器定义应该做同样的
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
答案 1 :(得分:48)
在下面的代码中,我将向您展示其中的差异
在@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
。您不需要将其添加到函数签名之上。
答案 2 :(得分:18)
@RestController
带注释的类与@Controller
相同,但隐含了处理程序方法上的@ResponseBody
。
答案 3 :(得分:16)
如果您使用@RestController
,则无法返回视图(在Spring / springboot中使用Viewresolver
),在这种情况下不需要@ResponseBody
。
如果使用@Controller
,则可以在Spring Web MVC中返回视图。
答案 4 :(得分:12)
实际上,要小心 - 它们并不完全相同。
如果您在应用程序中定义了任何拦截器,它们将不会应用于注释为@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 {...
最终不会让拦截器与它相关联。
答案 5 :(得分:8)
正如您在Spring文档中看到的那样(Spring RestController Documentation)Rest Controller注释与Controller注释相同,但假设默认情况下@ResponseBody处于活动状态,因此所有json都被解析为java对象。
答案 6 :(得分:4)
Spring4 +中新的@RestController注释,它将类标记为控制器,其中每个方法都返回一个域对象而不是视图。这是@Controller和@ResponseBody合作的简写。
答案 7 :(得分:2)
@RestController
。 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/>
可用作将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响应。
答案 8 :(得分:0)
@Controller
:此注释只是@Component
的专用版本,它允许根据类路径扫描自动检测控制器类。@RestController
:此注释是@Controller
的专用版本,它会自动添加@Controller
和@ResponseBody
注释,因此我们不必在我们的目录中添加@ResponseBody
映射方法。答案 9 :(得分:0)
protected function renderHttpException(HttpExceptionInterface $e)
{
if (app()->environment() !== 'production' && config('app.debug')) {
return $this->convertExceptionToResponse($e);
}
return parent::renderHttpException($e);
}
返回@Controller
。 View
返回@RestController
。
答案 10 :(得分:0)
@Controller在使用JSP的旧系统中使用。它可以返回视图。 @RestController用来标记控制器正在提供JSON响应类型的REST服务。因此它将@Controller和@ResponseBody批注包装在一起。
答案 11 :(得分:0)
@Controller注释指示该类是类似于Web控制器的“控制器”,而@RestController注释指示该类是默认情况下@RequestMapping方法采用@ResponseBody语义(即为REST API服务)的控制器。
答案 12 :(得分:0)
@RestController
是@Controller
和@ResponseBody
的组合。
@Controller
类中的请求流,而不使用@ResponseBody
批注:
@RestController
返回一个对象作为响应而不是视图。
答案 13 :(得分:-2)
@RestController
由@Controller
和@ResponseBody
组成,如果我们未在Method签名中使用@ResponseBody
,则我们需要使用@Restcontroller
。< / p>
答案 14 :(得分:-2)
@RestController不是使用@Controller和@ResponseBody,而是在Spring 4.0及更高版本中公开Rest API。