Diferencia entre la anotación Spring @Controller y @RestController

Diferencia entre la @Controller Spring @Controller y @RestController .

¿ @Controller puede @Controller anotación @Controller para las aplicaciones Web MVC y REST?
En caso afirmativo, ¿cómo podemos diferenciar si se trata de una aplicación Web MVC o REST?

  • @Controller se usa para marcar clases como Spring MVC Controller.
  • @RestController es una anotación de conveniencia que no hace más que agregar las anotaciones @Controller y @ResponseBody (ver: Javadoc )

Entonces las siguientes dos definiciones de controlador deberían hacer lo mismo

 @Controller @ResponseBody public class MyController { } @RestController public class MyRestController { } 

En el siguiente código, te mostraré la diferencia entre @controller

 @Controller public class restClassName{ @RequestMapping(value={"/uri"}) @ResponseBody public ObjectResponse functionRestName(){ //... return instance } } 

y @RestController

 @RestController public class restClassName{ @RequestMapping(value={"/uri"}) public ObjectResponse functionRestName(){ //... return instance } } 

el @ResponseBody está activado por defecto. No necesita agregarlo encima de la firma de la función.

@RestController clases anotadas @RestController son las mismas que @Controller pero la @ResponseBody en los métodos del manejador están implícitas.

En realidad, ten cuidado, no son exactamente lo mismo.

Si define los interceptores dentro de su aplicación, no se aplicarán a los Controladores anotados como @RestController , sin embargo sí funcionan con los controladores anotados @Controller .

es decir. configuración para el interceptor:

 @Configuration public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**"); } } 

y en la statement de un controlador de spring:

 @Controller public class AdminServiceController {... 

Funcionará, sin embargo

 @RestController public class AdminServiceController {... 

no termina teniendo el interceptor asociado a él.

Si usa @RestController no puede devolver una vista (usando Viewresolver en Spring / springboot) y sí, @ResponseBody no es necesario en este caso.

Si usa @controller puede devolver una vista en Spring webMVC.

Como puede ver en la documentación de Spring ( Spring RestController Documentation ), la anotación del controlador de reposo es la misma que la anotación del controlador, pero suponiendo que @ResponseBody está activo de forma predeterminada, por lo que todos los json se analizan en objetos java.

LA nueva anotación @RestController en Spring4 +, que marca la clase como un controlador donde cada método devuelve un objeto de dominio en lugar de una vista. Es una abreviatura de @Controller y @ResponseBody, que se han unido.

@RestController fue provisto desde la spring 4.0.1. Estos controladores indican que aquí los métodos @RequestMapping asumen la semántica de @ResponseBody por defecto.

En versiones anteriores, la funcionalidad similar se podía lograr usando abajo:

  1. @RequestMapping acoplado con @ResponseBody como @RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. se puede usar como una de las formas de usar JSON con Jackson o xml.

  3. MyBean se puede definir como

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

  1. @ResponseBody se trata como la vista aquí entre MVC y se envía directamente en lugar de enviarse desde Servlet Dispatcher y los convertidores respectivos convierten la respuesta en el formato relacionado como text / html, application / xml, application / json.

Sin embargo, el Restcontroller ya está acoplado con ResponseBody y los respectivos convertidores. En segundo lugar, aquí, ya que en lugar de convertir el cuerpo de respuesta, se convierte automáticamente a respuesta http.

La clase está marcada como @RestController, lo que significa que está lista para ser utilizada por Spring MVC para manejar las solicitudes web. @RequestMapping maps / al método index (). Cuando se invoca desde un navegador o usando curl en la línea de comando, el método devuelve texto puro. Eso es porque @RestController combina @Controller y @ResponseBody, dos anotaciones que dan como resultado que las solicitudes web devuelvan datos en lugar de una vista.

  • @Controller : esta anotación es solo una versión especializada de @Component y permite que las clases de controlador sean autodetectadas en base al escaneo de classpath.
  • @RestController : esta anotación es una versión especializada de @Controller que agrega la anotación @Controller y @ResponseBody automáticamente para que no tengamos que agregar @ResponseBody a nuestros métodos de mapeo.

@RestController es una composición de @Controller y @ResponseBody , si no usamos el @ResponseBody en la firma del Método, entonces necesitamos usar @Restcontroller .

En lugar de utilizar @Controller y @ResponseBody, @RestController le permite exponer las API de reposo en la spring 4.0 y posteriores.