Respuestas:
@Controller se usa para marcar clases como Spring MVC Controller.@RestControlleres una anotación de conveniencia que no hace más que agregar las anotaciones @Controllery @ResponseBody(ver: Javadoc )Entonces, las siguientes dos definiciones de controlador deberían hacer lo mismo
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleaf, no funcionará @RestControllerdebido a lo @ResponseBodyque se incluye en esta anotación.
@ResponseBodyconvierte los objetos devueltos en algo que podría estar en el cuerpo, por ejemplo, JSON o XML ( fuente )
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 @ResponseBodyestá activado por defecto. No necesita agregarlo sobre la firma de la función.
Si lo usa, @RestControllerno puede devolver una vista (Al usar Viewresolveren Spring / springboot) y sí @ResponseBodyno es necesario en este caso.
Si lo usa @Controller, puede devolver una vista en Spring web MVC.
@RestControllerLas clases anotadas son las mismas @Controllerpero @ResponseBodyestán implicados los métodos del controlador.
En realidad, tenga cuidado: no son exactamente lo mismo.
Si define algún interceptor dentro de su aplicación, no se aplicará a los Controladores anotados como @RestController, sin embargo, funcionan con @Controllercontroladores anotados.
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 declaración de un controlador Spring:
@Controller
public class AdminServiceController {...
Sin embargo, funcionará
@RestController
public class AdminServiceController {...
no termina teniendo asociado el interceptor.
@RestControllerfue introducido en Spring 4x. Esta anotación también se anota por sí misma, por @Controllerlo que si no funciona como un @Controllerinforme, informe esto como un error.
Interceptora una @RestController.
Interceptora @RestController.
Como puede ver en la documentación de Spring (Documentación de Spring RestController ), la anotación de Rest Controller es la misma que la anotación de Controller, pero suponiendo que @ResponseBody esté activo de forma predeterminada, por lo que todos los json se analizan en objetos java.
@RestControllerfue proporcionado desde la primavera 4.0.1. Estos controladores indican que aquí los métodos @RequestMapping asumen la semántica @ResponseBody por defecto.
En versiones anteriores, se podía lograr una funcionalidad similar usando a continuación:
@RequestMappingjunto con @ResponseBodycomo@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/> puede usarse como una de las formas de usar JSON con Jackson o xml.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@ResponseBody se trata como la vista aquí entre MVC y se envía directamente en lugar de ser enviado desde Dispatcher Servlet y los convertidores respectivos convierten la respuesta en el formato relacionado como texto / html, aplicación / xml, aplicación / 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 en respuesta http.
La anotación @RestController se introdujo en Spring 4.0 para simplificar la creación de servicios web RESTful. Es una anotación de conveniencia que combina @Controller y @ResponseBody, lo que elimina la necesidad de anotar todos los métodos de manejo de solicitudes de la clase de controlador con la anotación @ResponseBody.
@Controller: Esta anotación es solo una versión especializada @Componenty permite que las clases de controlador se detecten automáticamente en función del escaneo de classpath.@RestController: Esta anotación es una versión especializada de la @Controllercual agrega @Controllery @ResponseBodyanota automáticamente, por lo que no tenemos que agregar @ResponseBodya nuestros métodos de mapeo.@Controller se usa en sistemas heredados que usan JSP. Puede devolver vistas. @RestController es para marcar que el controlador está proporcionando servicios REST con el tipo de respuesta JSON. entonces envuelve las anotaciones @Controller y @ResponseBody juntas.
En lugar de utilizar @Controller y @ResponseBody, @RestController le permite exponer Rest APIs en Spring 4.0 y superior.