@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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *