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

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

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

@RestController带注释的类与@Controller相同,但处理程序方法上的@ResponseBody是隐含的。

  • @Controller用于将类标记为Spring MVC控制器。
  • @RestController是一个方便的注释,它只是添加了@Controller@ResponseBody注释(参见:Javadoc)。

所以下面两个控制器定义应该做同样的事情

@Controller
@ResponseBody
public class MyController { }


@RestController
public class MyRestController { }

正如你在Spring文档(Spring RestController文档)中看到的,Rest Controller注释与Controller注释相同,但假设@ResponseBody默认是活动的,因此所有的Java对象都被序列化为响应体中的JSON表示。

@RestController@Controller@ResponseBody的组合,如果我们没有在方法签名中使用@ResponseBody,那么我们需要使用@Restcontroller

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

如果你在应用程序中定义了任何拦截器,它们将不适用于注解为@RestController的控制器,但是它们可以用于注解为@Controller的控制器。

ie。拦截器的配置:

@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 {...

不会最终使拦截器与它相关联。

在下面的代码中,我将向你展示两者的区别 之间@controller
< / p >
@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默认是激活的。您不需要将它添加到函数签名之上。

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

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

@RestController自Spring 4.0.1开始提供。这些控制器表示这里的@RequestMapping方法默认假设@ResponseBody语义。

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

  1. @RequestMapping with @ResponseBody like @ RequestMethod (value = "/abc", method = RequestMethod.)GET,生成="application/xml" MyBean获取(){ 返回新的MyBean("hi") 代码}< / > < / p > < /李>

  2. <mvc:annotation-driven/>可以作为JSON与Jackson或xml一起使用的方式之一。

  3. MyBean可以这样定义

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

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

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

如果你使用@RestController,你不能返回一个视图(通过在Spring/springboot中使用Viewresolver),是的,在这种情况下不需要@ResponseBody

如果你使用@Controller,你可以在Spring web MVC中返回一个视图。

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

@Controller返回View@RestController返回ResponseBody

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

@Controller注解指出这个类是一个&;controller &;就像一个web控制器,而@RestController注释表明类是一个控制器,其中@RequestMapping方法默认假设@ResponseBody语义,即服务REST API

@RestController@Controller@ResponseBody的组合。

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

enter image description here

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

enter image description here