Uso de Controladores en Spring Boot
El punto de entrada a nuestra aplicación nos lo ofrece Spring a partir de los controladores. En esta entrada sobre uso de controladores en Spring Boot vamos a ver como funcionan y dan acceso a nuestra aplicación.
¿Cómo funcionan un Controller en Spring?
Un controlador va a ser el punto de entrada de nuestra aplicación, para ello se encarga de interceptar la llamada, adaptar los datos de entrada, procesarlos y devolverlos.
En el dibujo mostrado podemos ver como el Dispatcher Servlet es el responsable de la peticiones, es el controlador frontal en la arquitectura.
Aunque el funcionamiento más común con Spring es hacer uso de Rest a través de la anotación @RestController, podemos también mostrar vistas con JSP con lo que el diagrama de arriba podría variar un poco; ya que este se ha centrado únicamente en devolver la respuesta sin vistas.
Configuración de los Controladores en Spring Boot
Spring Boot nos facilita toda la autoconfiguración gracias al uso de starter y de la autoconfiguración que nos añade. Si hacemos uso de Spring MVC la configuración puede ser algo más tediosa ya que tendríamos que hacer configuraciones a través del WEB.xml y de una manera mucho más programática.
Para poder hacer uso de los Controladores en Spring lo primero es añadir la dependencia:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
El starter spring boot, usa Spring MVC, REST y Tomcat por defecto como servidor embebido y además añade de manera transitiva la siguientes dependencias:
- org.springframework.boot:spring-boot-starter
- org.springframework.boot:spring-boot-starter-tomcat
- org.springframework.boot:spring-boot-starter-validation
- com.fasterxml.jackson.core:jackson-databind
- org.springframework:spring-web
- org.springframework:spring-webmvc
Al añadir esta dependencia vamos a poder realizar la configuración de nuestro Controlador con las anotaciones @Controller @RestController.
Uso de Controlador REST Controller en Spring Boot
Para todas aquellas aplicaciones Rest vamos a hacer uso de la anotación @RestController, lo que nos permitirá recibir y responde peticiones de tipo REST.
La petición realizada será devuelta y enviada en formato XML o JSON, y además en la respuesta podemos devolver el status code deseado para conocer el estado de la respuesta.
Vamos a ver un ejemplo sobre su utilización:
@RestController public class RestControllerExample { @GetMapping(value = "/users/{userId}") public ResponseEntity<User> getUser(@PathVariable Long userId) { //do something User user = userService.getUser(userId); return ResponseEntity.ok(user); } }
El ResponseEntity anterior lo que va a hacer es escribir el body en el HTTP response indicando el código HTTP de la respuesta.
Sino queremos hacer uso de ResponseEntity, podemos hacer uso de la anotación @ResponseBody de la siguiente manera, aunque no indicamos explícitamente el Status Code.
@RestController public class RestControllerExample { @GetMapping(value = "/users/{userId}") public @ResponseBody getUser(@PathVariable Long userId) { //do something User user = userService.getUser(userId); return user; } }
Con la anotación @ResponseBody le estamos indicando a Spring que escriba únicamente el resultado directamente en la respuesta HTTP evitando cualquier resolución de vistas.
Como información importante, junto con los controladores se usan otras anotaciones de Spring como @GetMapping, @PostMapping, @PathVariable, @RequestParam, etc, es son necesarias como punto de entrada a la aplicación.
Uso de @Controller en Spring
Lo más normal cuando hacemos uso de @Controller en Spring es devolver una vista, por lo general, JSP o Thymeleaf. Es decir, vamos a devolver un objeto ModelAndView, lo cual contiene una vista y un modelo que será usado por el View Resolver para renderizar la vista.
Por ejemplo si hacemos uso de los ejemplos anteriores:
@RestController public class RestControllerExample { @GetMapping(value = "/users/{userId}") public ModelAndView getUser(@PathVariable Long userId) { User user = userService.getUser(userId); ModelAndView mv = new ModelAndView(); mv.setViewName("user"); mv.getModel().put("info", user); return mv; } }
En el fragmento de código anterior lo que hemos hecho ha sido crear un método que devuelve un ModelAndView con la información proporcionada. Este ModelAndView recibirá un objeto User el cual será accesible desde la vista al llamar al elemento info.
El View Resolver será el encargado de buscar en nuestro WEB-INF la vista llamada user con la extensión que tengamos definida.
Conclusión
Para poder dar acceso mediante un API a nuestra aplicaciones es imprescindible hacer uso de Controladores en Spring Boot. Si quieres ver un ejemplo de uso en una aplicación completa puedes echar un ojo a este ejemplo.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!