@Controller y @RestController Anotaciones en Spring Boot

@

Introducción

En Spring Boot, la clase de controlador es responsable de procesar las solicitudes de API REST entrantes, preparar un modelo y devolver la vista para que se muestre como respuesta.

Las clases de controlador en Spring están anotadas por el @Controller o la @RestController anotación. Estos marcan las clases de controlador como un controlador de solicitudes para permitir que Spring lo reconozca como un servicio RESTful durante el tiempo de ejecución.

En este tutorial, cubriremos la definición de @Controller y el @RestController anotaciones, sus casos de uso y la diferencia entre las dos anotaciones.

Si es nuevo en Spring Boot, es posible que también desee consultar nuestra guía completa sobre Cómo construir una API REST de Spring Boot.

Flujo de trabajo de la API REST de Spring Boot

Antes de definir las dos anotaciones, repasaremos rápidamente el flujo de trabajo de cómo Spring Boot maneja las solicitudes y procesos de la API REST y devuelve una respuesta:

Primero, la solicitud es recibida por el DispatcherServlet, que es responsable de procesar cualquier solicitud de URI entrante y asignarla a sus controladores correspondientes en forma de métodos de controlador. Una vez que se ha ejecutado el método del controlador, el recurso se procesa como una respuesta que puede ser JSON o XML.

En el diagrama anterior, los dos procesos encapsulados en el rectángulo son los procesos realmente implementados por un desarrollador. El resto lo ejecutan los servicios Spring que se ejecutan en segundo plano, incluido el DispatcherServlet.

La anotación @Controller

los @Controller la anotación es una especialización del estereotipo genérico @Component anotación, que permite que una clase sea reconocida como un componente administrado por Spring.

los @Controller La anotación extiende el caso de uso de @Component y marca la clase anotada como una capa comercial o de presentación. Cuando se realiza una solicitud, esto informará al DispatcherServlet para incluir la clase de controlador en la exploración de métodos mapeados por el @RequestMapping anotación.

Ahora, declararemos el controlador real para definir la lógica empresarial y manejar todas las solicitudes relacionadas con el modelo. Tree.

Primero, marque la clase con el @Controller anotación junto con @RequestMapping y especifique la ruta a /api/tree:

@Controller
@ResponseBody
@RequestMapping("/api/tree")
public class TreeController {

    @Autowired
    private TreeRepository repository;
 
    @GetMapping("/{id}")
    public Tree getTreeById(@PathVariable int id) {
        return repository.findById(id);
    }
  
    @GetMapping
    public Tree getTreeById(@RequestParam String name, 
                            @RequestParam int age) {
        return repository.findFirstByCommonNameIgnoreCaseAndAge(name, age);
    }
}

los @Autowired La anotación se usa para inyectar automáticamente dependencias del tipo especificado en el bean actual. En este caso, el TreeRepository bean se inyecta como una dependencia de TreeController.

@GetMapping es un atajo para @RequestMapping(method = RequestMethod.GET)y se utiliza para mapear HTTP GET solicitudes a los métodos de controlador asignados.

Hemos aplicado un @ResponseBody anotación al nivel de clase de este controlador. Cuando los controladores de solicitudes devuelven datos, como return repository.findById(), la respuesta se serializará en JSON antes de devolverse al cliente.

Alternativamente, podría haber anotado cada tipo de respuesta con el @ResponseBody anotación en su lugar:

 @GetMapping("/{id}")
    public @ResponseBody Tree getTreeById(@PathVariable int id) {
        return repository.findById(id);
    }

Si ejecutamos esta aplicación, asumiendo que ya tenemos una Tree instancia guardada en la base de datos, con el ID de 1, y presione el localhost:8080/1 endpoint, seríamos recibidos con:

{"species":"Salix babylonica","commonName":"Weeping willow", "age":"150"}

Por el @ResponseBody anotación, los campos del objeto obtenido se serializan en JSON y se devuelven al cliente que lo solicitó.

La anotación @RestController

los @RestController anotación en Spring es esencialmente una combinación de @Controller y @ResponseBody. Esta anotación se agregó durante la Spring 4.0 para eliminar la redundancia de declarar el @ResponseBody anotación en su controlador.

¡Esa es una declaración de anotación menos! Si también observa la definición de interfaz de las dos anotaciones para ver la diferencia entre las dos:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
  //..
}

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
  //..
}

los RestController la interfaz está anotada por @Controller y @ResponseBody en lugar de anotarlo directamente con @Component.

Si reemplazamos la anotación de nuestro controlador con @RestController, no necesitaremos cambiar el dominio y la capa de persistencia, ya que seguirán siendo compatibles con esta anotación.

Usando el controlador de ejemplo TreeController arriba, comparemos los cambios cuando usamos esta anotación:

@RestController
@RequestMapping("/api/tree")
public class TreeController {

    @Autowired
    private TreeRepository repository;
 
    @GetMapping("/{id}")
    public Tree getTreeById(@PathVariable int id) {
        return repository.findById(id);
    }
  
    @GetMapping
    public Tree getTreeById(@RequestParam String name, 
                            @RequestParam int age) {
        return repository.findFirstByCommonNameIgnoreCaseAndAge(name, age);
    }
}

Ahora, todos los métodos tienen @ResponseBody anotación aplicada a ellos, como @RestController lo aplica a nivel de clase.

Si ejecutamos esta aplicación, asumiendo que ya tenemos una Tree instancia guardada en la base de datos, con el ID de 1, y presione el localhost:8080/1 endpoint, seríamos recibidos con:

{"species":"Salix babylonica","commonName":"Weeping willow", "age":"150"}

Conclusión

Esencialmente, @RestController amplía las capacidades de ambos @Controller y @ResponseBody anotaciones.

Aparte del hecho de que @RestController existe para permitir que los controladores Spring sean una línea más cortos, no hay diferencias importantes entre las dos anotaciones.

La función principal de ambas anotaciones es permitir que una clase sea reconocida como un componente administrado por Spring y permitir el manejo de solicitudes HTTP usando la API REST.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad