Introducción
Contenido
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.
localhost:8080/api/tree/1
En todo case sería ese…
Saludos tienes un canal de youtube