spring @Controller和@RestController批注之间的区别


356

弹簧@Controller@RestController注释之间的区别。

可以@Controller注解同时用于Web MVC框架和REST的应用程序?
如果是,我们如何区分是Web MVC还是REST应用程序。

Answers:


471
  • @Controller 用于将类标记为Spring MVC Controller。
  • @RestController是一个方便的批注,除了添加@Controller@ResponseBody批注外没有其他作用(请参阅:Javadoc

所以以下两个控制器定义应该做的一样

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
我认为@RestController还将响应自动转换为JSON / XML。
arnabkaycee

1
只需共享指向解释差异的Spring教程的链接spring.io/guides/gs/rest-service
Mina Samy 2016年

9
另外,如果您使用模板引擎Thymeleaf,则@RestController由于@ResponseBody该注释中包含模板引擎,因此无法使用。
Sonique

3
@ResponseBody使返回的对象成为可能在体内的对象,例如JSON或XML(
Martin Thoma

59

在下面的代码中,我将向您展示 @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默认情况下启用。您无需将其添加到函数签名上方。


1
Java中的类名应以大写字母开头,即RestClassName(不是restClassName)。
瑞兹

24

如果使用@RestController,则无法返回视图(通过Viewresolver在Spring / springboot中使用),并且@ResponseBody在这种情况下不需要。

如果使用@Controller,则可以在Spring Web MVC中返回视图。


是的,@ ResponseBody可以放在方法上,并指示返回类型应直接写到HTTP响应主体(而不是放置在模型中,或解释为视图名称)
PraveenKumar Lalasangi,


14

实际上,要小心-它们并不完全相同。

如果您在应用程序中定义任何拦截器,则它们将不适用于注释为的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 {...

最终没有使拦截器与之关联。


2
@RestController是在Spring 4x中引入的。这个注解也被注释本身@Controller,所以如果它不能正常工作就像一个@Controller然后报告这个bug。
gaoagong

@bertybro,那不是很正确。您可以将关联Interceptor@RestController
拉维多尔

我当然已经成功将附加Interceptor到了@RestController
本·巴登

11

正如您在Spring文档(Spring RestController文档)中所看到的那样,Rest Controller注释与Controller注释相同,但是假设@ResponseBody默认处于活动状态,因此所有json都被解析为java对象。


4

Spring4 +中新的@RestController批注,将类标记为控制器,其中每个方法均返回域对象而不是视图。这是@Controller和@ResponseBody一起滚动的简写。


3

@RestController从Spring 4.0.1开始提供。这些控制器指示,这里@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/> 可以用作将JSON与Jackson或xml一起使用的方法之一。

  3. MyBean可以像

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

  1. @ResponseBody 在MVC中被视为此处的视图,它被直接调度,而不是从Dispatcher Servlet调度,并且各个转换器将响应转换为相关格式,如text / html,application / xml,application / json。

但是,Restcontroller已与ResponseBody和相应的转换器耦合。其次,在这里,由于不转换响应主体,而是将其自动转换为http响应。


2

@Controller返回View@RestController返回ResponseBody


2
您应该解释更多。这如何回答这个问题?
Yunnosch

@Yunnosch的“视图”是您的前端,例如jsp或html。ResponseBody可以是xml,json,yaml
G.Brown

编辑您的答案以添加有用的信息。但是我仍然不知道如何回答这个问题。您能否说出“是可以/不可以,因为....”这样的解释?
Yunnosch

1

在Spring 4.0中引入了@RestController注释,以简化RESTful Web服务的创建。这是一个方便的批注,将@Controller和@ResponseBody结合在一起–无需使用@ResponseBody批注来注释控制器类的每个请求处理方法。


0
  • @Controller:此注释只是其的专用版本,@Component它允许基于类路径扫描自动检测控制器类。
  • @RestController:此注释是一个专用版本@Controller,会自动添加@Controller@ResponseBody注释,因此我们不必@ResponseBody在映射方法中添加。

0

@Controller用于使用JSP的旧系统中。它可以返回视图。@RestController用来标记控制器正在提供JSON响应类型的REST服务。因此它将@Controller和@ResponseBody批注包装在一起。


-3

@RestController@Controller和的组成@ResponseBody,如果我们不使用@ResponseBodyin Method签名,那么我们需要使用@Restcontroller


-3

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


您想说的是,我认为@RestController还将响应自动转换为JSON / XML。?您使用抽象句子而不是清楚地解释它,我不建议这样做。
cinqS

仔细想想,@ Controller与产生和消耗mime类型JSON / XML或其他方式的行为相同。RestController隐式地做到这一点。
CoffeeBeanie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.