Respuestas:
@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 { }
Thymeleaf
, no funcionará @RestController
debido a lo @ResponseBody
que se incluye en esta anotación.
@ResponseBody
convierte 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 @ResponseBody
está activado por defecto. No necesita agregarlo sobre la firma de la función.
Si lo usa, @RestController
no puede devolver una vista (Al usar Viewresolver
en Spring / springboot) y sí @ResponseBody
no es necesario en este caso.
Si lo usa @Controller
, puede devolver una vista en Spring web MVC.
@RestController
Las clases anotadas son las mismas @Controller
pero @ResponseBody
está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 @Controller
controladores 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.
@RestController
fue introducido en Spring 4x. Esta anotación también se anota por sí misma, por @Controller
lo que si no funciona como un @Controller
informe, informe esto como un error.
Interceptor
a una @RestController
.
Interceptor
a @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.
@RestController
fue 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:
@RequestMapping
junto con @ResponseBody
como@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 @Component
y 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 @Controller
cual agrega @Controller
y @ResponseBody
anota automáticamente, por lo que no tenemos que agregar @ResponseBody
a 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.