spring @Controller和@RestController注释之间的区别。

@Controller注释可以同时用于Web MVC和REST应用程序吗? 如果是,我们如何区分它是Web MVC还是REST应用程序?


当前回答

@Controller:这个注释只是@Component的一个特殊版本,它允许基于类路径扫描自动检测控制器类。 @RestController:这个注释是@Controller的一个特殊版本,它自动添加@Controller和@ResponseBody注释,这样我们就不必把@ResponseBody添加到映射方法中了。

其他回答

@Controller注解指出类是一个像web控制器一样的“控制器”,而@RestController注解指出类是一个控制器,其中@RequestMapping方法默认假设@ResponseBody语义,即服务REST API

@Controller在使用jsp的遗留系统中使用。它可以返回视图。 @RestController用于标记该控制器正在提供JSON响应类型的REST服务。所以它将@Controller和@ResponseBody注释包装在一起。

@RestController是@Controller和@ResponseBody的组合。

@Controller类中的请求流,不使用@ResponseBody注释:

@RestController返回一个对象作为响应而不是视图。

在下面的代码中,我将向您展示两者的区别 @ 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是Spring 4.0.1以来提供的。这些控制器表明这里的@RequestMapping方法默认采用@ResponseBody语义。

在早期版本中,类似的功能可以通过使用以下方法实现:

@RequestMapping加上@ResponseBody,比如@RequestMapping(value = "/abc", method = RequestMethod。GET,生成="application/xml" MyBean获取(){ 返回新的MyBean("hi") } <mvc:annotation-driven/>可以作为使用JSON和Jackson或xml的方式之一。 MyBean可以这样定义

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) 公共类MyBean{ field1 field2 . . / / getter、setter }

@ResponseBody在这里被视为MVC中的视图,它直接被分派,而不是从Dispatcher Servlet分派,各自的转换器将响应转换为相关的格式,如text/html, application/xml, application/json。

但是,Restcontroller已经与ResponseBody和各自的转换器耦合。其次,在这里,由于不是转换responsebody,而是自动转换为http response。