Construir un API REST funcional es uno de los pasos más importantes cuando trabajas con Spring Boot. Dominar la forma en que se exponen servicios HTTP para que un cliente los consuma abre la puerta a proyectos profesionales y escalables. A continuación se explica, paso a paso, cómo crear el primer servicio de lectura (Read) dentro de un CRUD completo.
¿Qué hace la anotación @RestController y por qué es clave?
El punto de partida es crear una clase llamada UserRestController dentro de la carpeta controller [0:42]. Esta clase se anota con @RestController, una anotación que hereda de @Controller y que, además, se encarga de que todos los métodos que se definan allí devuelvan datos en formato JSON de forma automática. Esto significa que no necesitas configurar manualmente la serialización de objetos: Spring Boot lo resuelve por ti.
Dentro de este controlador se definen los servicios que un cliente podrá consumir: crear, obtener, eliminar y actualizar registros.
¿Cómo se estructura la capa de casos de uso?
Para mantener una arquitectura limpia, se crea un paquete llamado caseuse (case use) [1:22]. Dentro de él se define una interfaz llamada GetUser que declara un método getAll(), el cual retorna una lista de entidades de tipo User.
¿Cómo se implementa el caso de uso?
Se crea la clase GetUserImplement que implementa la interfaz anterior [1:50]. Esta clase:
Recibe por inyección de dependencias (a través del constructor) el servicio UserService.
Implementa el método getAll() delegando la lógica al método getAllUsers() de UserService.
Esta separación en capas permite que el controlador no dependa directamente de la lógica de negocio, sino de una abstracción representada por la interfaz.
¿Cómo se registra el caso de uso como bean de Spring?
Dentro de la carpeta de configuración se crea la clase CaseUseConfiguration [2:22], anotada con @Configuration. En ella se define un @Bean que retorna una instancia de GetUser:
java
@Configuration
public class CaseUseConfiguration {
Este bean recibe como parámetro la dependencia UserService, que Spring inyecta automáticamente gracias al contenedor de inversión de control (IoC).
¿Cómo se expone el servicio REST para listar usuarios?
De vuelta en UserRestController, se inyecta el caso de uso GetUser mediante el constructor [3:08]. Luego se crea un método que devuelve la lista de usuarios:
java
@RestController
@RequestMapping("/api/users")
public class UserRestController {
private final GetUser getUser;publicUserRestController(GetUser getUser){this.getUser= getUser;}@GetMapping("/")publicList<User>get(){return getUser.getAll();}
}
@RequestMapping("/api/users"): define la ruta base del controlador [3:22].
@GetMapping("/"): indica que el método responde a peticiones HTTP de tipo GET [3:42].
Cuando un cliente accede a /api/users/, obtiene la lista completa de usuarios registrados en la base de datos.
¿Cómo se prueba el servicio con Postman?
Una vez desplegada la aplicación, se utiliza Postman para consumir el servicio [4:10]. La URL completa queda así:
http://localhost:8081/app/api/users/.
Es fundamental verificar que el método HTTP seleccionado sea GET. Al enviar la petición con Send, el servidor responde con todos los usuarios en formato JSON.
El puerto 8081 y el contexto /app provienen de la configuración definida en el archivo application.properties del proyecto.
Este primer servicio corresponde a la letra R (Read) del acrónimo CRUD (Create, Read, Update, Delete). Con esta base ya establecida, los siguientes servicios de creación, actualización y eliminación seguirán un patrón muy similar. ¿Ya probaste tu servicio en Postman? Comparte tu experiencia en los comentarios.
Muy importante hacer lo que hizo el profesor, pues no debemos de depender de implementaciones concretas sino que hay que depender de abstracciones o interfaces.
Esto permite mayor desacoplamiento entre mis capas de la aplicación. De hecho es la base del 5 principio SOLID.
👍
creo que también al hacer esto se usa single responsability e interface segregation
En las clases de este módulo se muestran varias formas de programar los métodos para el CRUD pero sin ahondar mucho en detalles sobre el proceso... Leyendo esta guía de Spring pude clarificar mucho más los conceptos del módulo, ya que los ejemplos del profesor no me fueron suficiente para entender el por qué de cada paso para crear un servicio REST.
Tengo una duda, la estructura del proyecto con controller, caseUse, Service y Repository de donde nace? osea... como se llama esa arquitectura?
Porque el tema de caseUse me suena a DDD, pero tener Controller, Service y Repo me hace acordar a MVC.
Estas en lo correcto, es parte de DDD (Domain Drive Design), pero es una pequeña parte de la arquitectura Hexagonal.
Bro si resolviste tu duda me haces saber... me causa curiosidad como se llama esa arquitectura?
por que no usar @Autowired private UserService userService; directamente dentro del UserRestController?
por que usar usecase?
Para el metodo get, recomiendo nó asignarle el "/" para que cuando la ruta api/users sea consumida, esta funcione.
Si se le coloca, la ruta expuesta anteriormente no funcionará, obligandonos a colocar el slash.
Si no se lo colocamos, funciona de ambas maneras, sin slash o con el
Casi me iba del curso. Me interesa el uso de Use Case dentro de Clean Architecture, me parece una muy buena practica.
Igual me paso, me salte hasta esta sección y esta interesante, tenes alguna referencia para reforzar el punto que mencionas de clean architecture?
Viendo el curso me genera una duda. ¿La estructura presentada se utiliza en proyectos reales?,¿a qué tipo de arquitectura hace referencia? Es debido a la gran cantidad de paquetes que fueron creados. Agradecería sus opiniones.
estoy en las mismas, no entiendo porque esa capa "caseuse", lo mas común que he visto es que en la capa de controlador se utilice los servicios de la capa de negocio, pero con esto quede confundido, a una aplicacion basica de java, algun monolito seria "entity, dao, service al front" en una app spring boot seria "entity, repository, service, al controller" pero ese tipo de arquitectura no la comprendi
Me devuelve los datos de esta manera el endpoint a alguien más le pasa?
Ya encontre el error era porque no tenia getters ni setters en mi entidad User por si a alguien más le pasa.
De verdad, cuando te falta algo en lo que has programado, tienes que mirar todos o casi todos los videos anteriores porque la documentación que está subida en el propio video no se corresponde.
Estoy un poquito arrepentida de pagar la anualidad de platzi.
Si, las clases son muy interesantes, y agradezco muchisimo el trabajo de cada profesor, pero claro cuando intentas seguir con el siguiente video con los archivos que se adjunta en el video anterior para poder seguir, es imposible porque no se corresponden con lo que está en el video. Faltan archivos o el archivo tiene código diferente.
Y bueno lo de la anualidad no es sólo por esto, sino un cúmulo de cosas que en otras plataformas no me he encontrado.
100% de acuerdo con vos. pero asi y todo el curso es un poco avansado esto. trata de hacer todas la preguntas posibles. Yo lo estoy usando de repaso. y es verdad lo que decis. pero bueno trato de ayudar a los que estan re perdidos. lo peor que podes hacer es quedarte callada y seguir mirando un video tras otro
En platzi e tomado cursos muy buenos, pero este curso si sinceramente requiere una reestructuracion ya que es muy confuso dificil de entender y no tiene una documentacion a decuada, (por no decir que no tiene documentacion) que ayude a entender el por que de las cosas
Lo que esta en la documentación no tiene sentido con lo que esta en el video, como implementaciones que no se están usando en el video y en la documentación todo esta dado vuelta, aun que creo que es un curso avanzado hay bastantes cosas por mejorar.
Necesitan rehacer el curso
Me parece bastante desordenado para hacer las cosas, saltando de un lado a otro, con todas esas clases abiertas, no se sabe al final en donde esta, muy mala manera de enseñar, haciendo cosas sin explicar el por qué ni el para qué
Por que crear otra clase CaseUseConfiguration y no hacerlo en el MyBeanConfiguration?
Hola, el Curso de Postman que dejo el profesor, ya lo dieron de baja en Platzi?.
Porque intente acceder a dicho curso y da error.
Gracias.
Es correcto, Elisa. El curso quedo inhabilitado. No obstante puedes revisar estas clases complementarias implementando Postman.
¿Dónde está el autowired?
¿Lo que está viendo el profe tiene a ser su controller?
ojala me puedan contestar, tengo duda si seria buena idea que el servicio tuviera una interfaz, para que al momento de cambiar la base de datos se pueda cambiar unicamente la implementación de dicho servicio para apuntar a otro repositorio, supongamos que se va cambiar de mysql a mongo.
El apartado de servicio siempre lo he visto como una clase, ya que este tiene logica de negocio, pero, debe de depender del dominio, en los archivos que ya tenemos, estamos dependiendo de los entitys, y eso genera un problema como el que mecionas, que pasa si quiero cambiar mi base de datos
Después de mucho batallar funciona gracias a sus aportes compañeros
No sé a ustedes, pero a mí al momento de utilizar el PostMan me generaba un error 404, la solución fue colocarle la anotación @ResponseBody, para que muestre la respuesta. De esta manera ya pueo observar el JSON junto con una respuesta 200