restcontroller responsebody example ejemplo java spring spring-mvc

java - responsebody - Diferencia entre la primavera @Controller y @RestController anotación



restcontroller spring example (12)

Diferencia entre la primavera @Controller y @RestController anotación.

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


@Controller se utiliza para los controladores Spring tradicionales y ha sido parte del marco durante mucho tiempo.

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, que elimina la necesidad de anotar todos los métodos de manejo de solicitudes de la clase del controlador con la anotación @ResponseBody.

Los controladores Spring MVC @Controller Classic pueden anotarse con la anotación @Controller. Esto es simplemente una especialización de la clase @Component y permite que las clases de implementación se detecten automáticamente a través del escaneo de classpath.

Por lo general, @Controller se usa en combinación con una anotación @RequestMapping utilizada en los métodos de manejo de solicitudes.

Ejemplo:

@Controller @RequestMapping("books") public class SimpleBookController { @GetMapping("/{id}", produces = "application/json") public @ResponseBody Book getBook(@PathVariable int id) { return findBookById(id); } }

El método de gestión de solicitudes se anota con @ResponseBody. Esta anotación permite la serialización automática del objeto de retorno en el HttpResponse.

Spring MVC @RestController @RestController es una versión especializada del controlador. Incluye las anotaciones @Controller y @ResponseBody y, como resultado, simplifica la implementación del controlador:

@RestController @RequestMapping("books-rest") public class SimpleBookRestController { @GetMapping("/{id}", produces = "application/json") public Book getBook(@PathVariable int id) { return findBookById(id); } }

El controlador está anotado con la anotación @RestController, por lo tanto, no se requiere @ResponseBody.


Como puede ver en la documentación de Spring ( Javadoc ), la anotación del resto del controlador 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 los objetos java.


En el código de abajo 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 de forma predeterminada. No es necesario agregarlo por encima de la firma de función.


En lugar de usar @Controller y @ResponseBody, @RestController te permite exponer las API Rest en Spring 4.0 y superior.


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

Si define algún interceptor dentro de su aplicación, no se aplicarán a los controladores anotados como @RestController , sin embargo, funcionan con los controladores anotados de @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 declaración de un controlador Spring:

@Controller public class AdminServiceController {...

Funcionará, sin embargo

@RestController public class AdminServiceController {...

No termina teniendo el interceptor asociado.


LA nueva anotación @RestController en Spring4 +, que marca a la clase como un controlador donde cada método devuelve un objeto de dominio en lugar de una vista. Es una taquigrafía para @Controller y @ResponseBody rodados juntos.


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

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


@RestController clases anotadas de @RestController son las mismas que las de @Controller pero están implícitos los métodos @ResponseBody en el controlador.


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


@RestController se proporcionó desde la primavera 4.0.1. Estos controladores indican que aquí los métodos de @RequestMapping asumen la semántica de @ResponseBody de forma predeterminada.

En versiones anteriores, la funcionalidad similar podría lograrse utilizando a continuación:

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

  2. <mvc:annotation-driven/> puede usarse 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 despacharse desde Dispatcher Servlet y los convertidores respectivos convierten la respuesta en el formato relacionado como text / html, application / xml, application / json.

Sin embargo, 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.


  • @Controller : esta anotación es solo una versión especializada de @Component y permite que las clases del controlador se detecten automáticamente según el escaneo de classpath.
  • @RestController : esta anotación es una versión especializada de @Controller que agrega automáticamente la anotación @Controller y @ResponseBody para que no tengamos que agregar @ResponseBody a nuestros métodos de mapeo.

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

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

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