tengo aprox. 8 dias para aprender lo básico de springboot, incluido las APIs rest, este es mi primer video y puedo decir que entendí muchos conceptos que antes parecían complicados, muchas gracias
Me sumo a los comentrios. Me encanta como desglosa los conceptos complicados y los hace accesibles para todos los niveles. Además genera coriosidad por seguir aprendiendo. (mapStruct y métodos query )
Mis mejores deseos, tu canal el de los más valorados para mi persona ya que sueles crear excelente contenido, personalmente mejor que cursos de pago de udemy.
Yo tengo una duda, cuál es la diferencia de api rest y un CRUD ? O es lo mismo ? 🤔 Por qué se que creas eliminas etc pero no sé cuándo es api y cuando es CRUD por qué siempre veo todo completo
@@jonnathangonzalez8639 Bueno un crud en un conjunto basico de operaciones que vendrían a ser Crear,Leer,Actualizar y Borrar, mientras la api rest es un estilo de arquitectura para diseñar servicios web y por la cual la apirest implementa las operaciones crud
@@jonnathangonzalez8639 api rest es un crud sin front, el crud es un api rest con un front donde ves todo lindo y simple, en un api rest haces un crud pero mediante rutas url
No encontré el link del repositorio, pero copié la inserción de los datos sql INSERT INTO fabricante(id,nombre) VALUES (1,"Asus"); INSERT INTO fabricante(id,nombre) VALUES (2,"Lenovo"); INSERT INTO fabricante(id,nombre) VALUES (3,"Hewlett-packard"); INSERT INTO fabricante(id,nombre) VALUES (4,"Samsung"); INSERT INTO fabricante(id,nombre) VALUES (5,"Seageate"); INSERT INTO fabricante(id,nombre) VALUES (6,"Crucial"); INSERT INTO fabricante(id,nombre) VALUES (7,"Gigabyte"); INSERT INTO fabricante(id,nombre) VALUES (8,"Huawei"); INSERT INTO fabricante(id,nombre) VALUES (9,"Xiaomi"); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (1,"Disco duro STA3 1TB",86.99,5); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (2,"Memoria RAM DDR4 8GB",120,6); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (3,"Disco SSD 1 TB",150.99,4); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (4,"GeForce GTX 1050tu",185,7); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (5,"GeForce GTX 1080 Xtreme",755,6); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (6,"Monitor 24 LED Full HD",202,1); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (7,"Monitor 27 LED Full HD ", 245.99,1); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (8,"Portatil Yoga 520",559,2); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (9,"Portatil Ideapd 320",444,2); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (10,"Impresora HP Deskjet 3720",59.99,3); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (11,"Impresora HP Laserjet Pro M26nw",180,3);
te hago una consulta: veo que se usan en algunos proyectos otras dependencias, es decir, al crear el proyecto en Sprint. Sera que depende el tipo de Api? cuando puedas agradeceria tu comentario. Mil gracias.
Hola, viendo este video me he fijado en algunas cosas y me surgieron las siguientes dudas, seria bueno que por favor me contestaras por puro aprendizaje, ya que no se cuando usar una u otra cosa: 1- Por que se utiliza CrudRepository en vez de JPARepository? 2- Por que utilizar el patrón DAO y no un DTO al momento de realizar la persistencia de la data? Muchas gracias, excelente contenido!
Hola, muchas gracias por tu comentario. Tus preguntas son bastante habituales al empezar a trabajar con Spring, así que intentaré explicar de la manera más clara posible, aunque el segundo punto amerita un tutorial completo. Respuestas: 1) JPA dispone de distintos repositorios, entre ellos se encuentran CrudRepository, JpaRepository y PagingAndSortingRepository, entre muchos otros. Puedes elegir el que prefieras, pero la elección dependerá de las necesidades de tu proyecto, ya que cada repositorio ofrece características propias. En este caso, utilizamos CrudRepository porque solo necesitamos las operaciones básicas de un CRUD. 2) Los DTO (Data Transfer Object) son objetos que se utilizan para transferir y propagar datos dentro de nuestra aplicación, mientras que los DAO (Data Access Object) se emplean exclusivamente para el acceso a datos. En conclusión, utiliza DTO cuando necesites recibir, devolver y propagar datos en tu aplicación, y DAO cuando estés realizando operaciones con la base de datos. Es una mala práctica interactuar con bases de datos utilizando DTO, así como también lo es devolver datos directamente al cliente usando DAO. Espero que estas aclaraciones te hayan sido de ayuda. ¡Saludos!
Hola, muchas gracias por el trabajo que haces, por cierto, muy bien hecho. Me gustaria, por mi parte, que fueras mas despacio. Para mi explicas muy rapido, podrias ir mas lento, simplemente una opinion, constructiva. Aun asi, mil gracias, un saludo desde España :)
Hola, gracias por comentar. Te explico brevemente: DAO y DTO son 2 patrones de arquitectura que cumplen funciones diferentes. DAO (Data access Object) son objetos que se usan para interactuar con la base de datos, punto. DTO (Data transfer Object) se usa para transferir o compartir atributos entre objetos. Básicamente es eso. ¡Saludos!
Gracias por todo hermano, me ha servido mucho... Tengo una duda. Cuando realizas la inyeccion de la dependencia en el MakerServiceImpl, ¿Por se inyecta la interfaz IMakerDao y no la implementacion (MakerDAOImp)? ¿Cual es la diferencia entre inyectar una u otra? De antemano gracias hermano.
Hola, es un primcipio de inyeccion de dependencias, siempre debes inyectar la interface y spring se encargará de buscar la implementacion por ti. ¡Saludos!
Excelente canal muy completa la información... podrias hacer alguno con el patron de diseño mvc? Quizas parecido a este? Para saber bien las diferencias entre mvc y dao
Hola, tendré en cuenta tu sugerencia. Te aclaro algo, MVC es un patrón de arquitectura y DAO es un patrón de diseño. Son dos cosas completamente diferentes, más bien la comparación correcta sería: MVC vs Rest. ¡Saludos!
Excelente explicacion, muy buenas practicas. De lo mejor que he visto en español !!!! Me gustaria saber si es posible en spring implementar middlewares para validar los parametros de las rutas. Saludos
Hola, usualmente los parametros de validan con una librerìa llamada VALIDATION, puedes agregar dicha libreria desde el Spring Initializr. Pero si quieres tener un codigo que se ejecute antes de llegar al controller podrias implementar un INTERCEPTOR http. Lo interceptores se ejecutan antes del controller y allì puedes ejecutar lo que quieras. Saludos.
@@unprogramadornace gracias por el aporte. Me gustaria ver un video de API REST con todo lo que utilizas en el video y ademas incorporarle INTERCEPTOR , WEBSOCKETS y manejar imagenes desde el backend. Sin duda seria el tutorial mas completo y mejor de youtube. Bendiciones!! Gracias por todo!!!
Buenas profesor, no entiendo el error null cuando lanzas el findbyId, ya que List tiene valores en el 48:30. Sin embargo le pones un JsonIgnore y sí que te muestra los productos, cuando sólo debería obtener el id y nombre del maker al decirle que ignore la lista de productos.
Hola, tu pregunta es bastante interesante. Para que entiendas el concepto debes tener en cuenta el fetch que estamos usando. En el vídeo usamos LAZY, eso quiere decir "carga perezosa", eso lo que hace es que solo se hará la consulta a base de datos cuando se llame al método Get correspondiente del atributo en cuestión. Es por eso que nos devuelve un null, porque no estamos llamando explícitamente al método Get, entonces para evitar ese null le decimos al serializador de Spring que ignore ese campo. ¡Saludos!
@@unprogramadornace Eso es correcto y lo comprendo, pero una vez pones el JsonIgnore, no ignora el campo y SÍ se obtiene el resultado de Lista de Productos, aunque le pones JsonIgnore. Evitas el error de null, pero luego te ofrece el dato. La pregunta concreta es, por qué el endpoint devuelve los datos del maker y el productList, cuando a productList le has puesto un ignore para que no te lo muestre
Hola, le puse @JsonIgnore al entity para que no intente seriazarlo en una primera instancia, despues llamamos al metodo get product list en la clase MakerController en la linea 32. Alli se hace una consulta explicita al metodo get del listado y por eso el me retorna la respuesta. ¡Saludos!
Una pregunta?? Que plugin o extensión usas de intellij idea para que se vean así los iconos o carpetas y otra cosa.. la parte del controllers, cuando haces la conversión de datos de la entidad al dto, eso no se hace en la parte del servicio directamente?? escuché que dijiste eso que todas las funcionalidad se debe hacer en el servicio, eso estoy confundido te agradecería si me puedes explicar eso
Hola, me preguntan frecuentemente sobre la configuración que tengo en mi intellij, por ese motivo hice un vídeo completo en dónde explico mi configuración, te comparto el enlace: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-xyKsnuuHHRI.html Por otro lado, el mapeo de objetos debería hacerse en el Service, en el vídeo por motivos educativos y prácticos lo hicimos en el controller debido a que profesionalmente se usan tecnologías llamadas Mappers, pero eso es otro tema. ¡Saludos!
Buenas, tengo otra pregunta, si a postman se le pasa un makerDto, por que cuando incluimos el @JsonIgnore lo hacemos en la entidad Maker y no en MakerDto. Es que veo que al incluir esta anotación en Maker, igualmente si que se muestra la lista de productos en postman.Gracias por tu curso
Hola, en este caso no sería conveniente utilizar @JsonIgnore en el DTO debido a que si haces eso ya no vas a obtener el listado de productos en tu respuesta porque @JsonIgnore le dice a Jackson que no serialice el parámetro. Si lo ponemos en el Entity tampoco causaría problemas aunque lo pusimos allí porque estábamos devolviendo directamente el listado de entity. Pero al usar el DTO ya no es necesaria esa anotación. ¡Saludos!
Gracias por compartir conocimiento, tengo el siguiente error al consumir los métodos Product: Handler dispatch failed: java.lang.StackOverflowError pareciera que se esta generando un loop, estoy usando la versión 3.2.3 y java versión 17
Hola, es complicado darte una solución porque esa excepción puede ser disparada por muchas razones. Trata de comparar tu código con el mío. Espero que puedas encontrar el error. ¡Saludos!
Buenas, No se porque pero cuando me meto en al página para copiar el banner no se ve tan legible como el de tu ejemplo. Lo raro que l primera vez si pero ahora nada. ponga lo que ponga, ilegible. Un saludo.
Hola, en primer lugar felicitaciones muy buen video. Tengo un error en el save "Detail: Ya existe la llave (id)=(1)." cuando lo envío en el postman, que podria ser? (uso postgres, y tengo el strategy en IDENTITY en la entidad) Gracias!
Hola, significa que estás tratando de guardar un registro que ya existe, se supone que si el registro ya existe se debería actualizar. Es difícil darte una solución específica debido a que debería revisar el código para ver cómo se está trabajando, pero el error está relacionado al ID del registro que estás tratando de guardar. ¡Saludos!
Hola, usualmente suelo ingresar de vez en cuando a las documentaciones para ver los nuevos cambios, también googleando un poco sobre las tecnologías que uso pero en general siempre el mejor lugar para buscar información es la documentación oficial. ¡Saludos!
Hola, por desgracia el repositorio donde estaba el código fuente ya no está disponible a causa de un problema que tuve con los repos en su momento. ¡Saludos!
Siempre que escucho que la lógica debe implementarse en el service, pensaba que en el service también se validaba y que el controlador quedaba muy limpio de código, me puedes despejar la duda por favor
Hola, si tienes que validar datos puedes hacerlo en el controller sin problema, es más si usas la librería de Validation para hacer una validación más apropiada siempre se hace desde el controller. El service se usa para ejecutar lógica compleja, allí encuentras la funcionalidad en sí de la aplicación. Es común que en aplicaciones empresariales encuentres controladores gigantes, entonces no siempre queda tan limpio pero lo importante es que la arquitectura de la aplicación maneje un alto desacoplamiento y lo ideal es que tú le envíes al service datos correctos y limpios para que haga lo que tenga que hacer. ¡Saludos!
Después de buscar entre un mar de videos, contenido y cosas sin sentidos, al fin encuentro algo que si se entiende y que me puede servir de impulso para mi futuro en Spring, muchas gracias profe, de verdad le agradezco, espero siga subiendo contenido!
Wenas, muy buen tutorial, me he suscrito a tu canal. Aunque tengo una duda, cuando coloco la inyección al servicio o repositorio con @Autowired, me aparece la siguiente advertencia: "Field injection is not recommended" que significa "No se recomienda la inyección en el campo", osea que el método que proporcionas no es recomendado por Spring o algo así, pero me parece raro porque vengo de otros lenguajes y también se usa este tipo de método de manera similar, aunque aveces en un constructor como en Nest.js, por eso me es muy rara la advertencia. Además que el IDE no me indica si debo usar otro método para la inyección de dependencias, asi que me es más confuso aún XD Busque en Google y usan algo llamado Spring Context y por lo que entendí, lo inyectán en el constructor o algo así, pero hay que hacer muchos más pasos y honestamente me gusta más tu método de hacerlo. Me gustaría saber porque sucede ese warning, ¿y que puedo hacer para evitarlo? ¿O simplemente la ignoro? Muchas gracias de antemano.
Hola, efectivamente los beans se guardan en el Spring Context. El warning es completamente normal, pero si quieres resolverlo debes tener en cuenta lo siguiente: Existen 3 formas de inyectar un bean: Por autowired, por constructor o por método setter. En este caso yo estoy inyectando por medio de autowired, pero últimamente esa forma se está dejando de usar y por eso te marca el warning, si quieres eliminar el warning solo debes hacer la inyección por medio de método constructor y listo. Una aclaración. Cualquiera de los 3 métodos de inyección son correctos y está bien usarlos. Saludos.
@@unprogramadornace Hola de nuevo, estaba terminando el vídeo y surgió este error: ERROR: duplicate key value violates unique constraint "fabricante_pkey" Detail: Key (id)=(3) already exists. 2023-12-07T12:19:48.700-03:00 ERROR 60486 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.DataIntegrityViolationException: could not execute statement [ERROR: duplicate key value violates unique constraint "fabricante_pkey" Detail: Key (id)=(3) already exists.] [insert into fabricante (nombre) values (?)]; SQL [insert into fabricante (nombre) values (?)]; constraint [fabricante_pkey]] with root cause org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "fabricante_pkey" Detail: Key (id)=(3) already exists. Las diferencias claves que hay es que yo estoy usando Docker con PostgreSQL, pero todo lo demás es exactamente igual, he seguido paso a paso lo que explicaste y esto es lo único que no me funciona. Mi teoría es que al usar el archivo de import, hibernate no sabe cual es el ultimo id, por ende empieza del 1 de nuevo. Ya que en un inicio daba error con el id 1, luego copie el código desde github y empezo a aumentar la secuencia. ¿Es debido a que uso PostgreSQL? ¿Qué recomiendas para solucionar este error?
un vido explicando más a detalle el uso de queryes ya que los ejemplos son los convencionales el tipico crud con jpa o crud repository, pero para hacer consultas más avanzadas
Muchas gracias por el video. Me surgió una duda, por qué se utiliza DAO y Repository al mismo tiempo? No es redundante crear un DAO sobre un Repository?
Hola, no necesariamente es redundante aunque puede parecer que sí, lo que hice fue agregarle una capa más de abstracción para desacoplar aún más la funcionalidad de conexión a base de datos, a veces es útil, otras veces no, pero todo depende de la funcionalidad que se quiera dar. ¡Saludos!
Una duda en 1:13:41 aprox, en el método findAll de Product controller, cuando construyes el objeto de respuesta que es una lista , le haces un stream, luego un map y dentro del map una funcion lambda donde cada product lo conviertes a un ProductDTO le seteas el maker con product.getMaker(), aqui no se estaría violando el principio de no enviar en la respuesta entidades de negocio, y deberia ser un makerDTO, es decir se tendría que hacer una nueva conversión del maker a un makerDTO?
Estoy en el minuto 30:46 y cuando voy escribiendo el Query Method no me aparece las sugerencias como en el video. Tengo la version 2023.3.6 Community Edition.
Hola, una pregunta, ¿Hay alguna documentación para poder visualizar de forma más gráfica los usages que tiene cada clase / interfaz java / package ? Espero se entienda la pregunta, buen video por cierto 👍👍
Hola, creo que entiendo tu pregunta. Pienso que lo mas cercano a eso seria el javadoc. Practicamente vamos documentando el codigo a medido que lo vamos escribiendo. Te doy un ejemplo de como se hace: /** * Calcula la suma de dos enteros. * * @param a El primer entero a sumar. * @param b El segundo entero a sumar. * @return La suma de 'a' y 'b'. */ public int sumar(int a, int b) { return a + b; } Saludos.
Excelente! no entendí el método stream().map en el controller... tendrás un video donde se explica eso? o alguien tendrá una buena explicación en algún link?
Hola, eso quiere decir que tienes falencias en fundamentos de Java 8. Te recomiendo estudiar un poco de programación funcional, por ahora no tengo vídeo sobre ello entonces deberás buscar en Google. ¡Saludos!
Una duda, por que en el video "DAO vs. DTO: Batalla de Patrones en Diseño de Software " la logica de negocio para retornar el DTO al cliente está en el servicio pero en este video la logica esta en el controlador, es lo mismo? o no es importante
Hola, la logica debe ir en el service, aqui en este video lo hago en el controller simplemente por optimizar tiempo, pero El debe ser es que lo hagas en el service. ¡Saludos!
Hola, no es necesario un microservicio, solo levantas esta APP y listo la puedes consumir. El tema es que debes darle manejo a los cors, que son el mecanismo de de intercambio de datos entre un back y un front. ¡Saludos!
Tengo una curiosidad porque los atributos en la base de datos en el caso del producto porque no se genera en orden como esta en el modelo de java? es decir primero el id luego el nombre despues el precio. por ultimo la fk ? hay forma de hacer respetar eso?
Hola, en su momento tuve esa misma pregunta, investigué sobre eso y encontré que JPA no maneja un orden en específico sino que lo hace en desorden y lamentablemente no hay forma de darle un orden. Si quieres tener tus atributos de la tabla ordenados es mejor que crees la tabla manualmente y lo dejes que JPA lo haga por ti. ¡Saludos!
hasta el minuto 4:39 no he podido levantar el proyecto con eclipse porque inteliJ Idea tiene licencia y no me deja instalarlo ya que lo tuve de prueba y he estado intentandolo con eclipse y o me deja
Hola, puedes usar intellij IDEA en la versión community, esa es gratis. Lamentablemente no puedo ayudarte más porque el error debe ser causado por la configuración de tu PC entonces es difícil darte una solución. ¡Saludos!
Excelente contenido, tienes pensado hacer un video sobre el manejo de errores con RestControllerAdvice y Handler? Estaría genial, gracias por compartir tus conocimientos ✌️
INSERT INTO fabricante(id,nombre) VALUES (1,'Asus'); INSERT INTO fabricante(id,nombre) VALUES (2,'Lenovo'); INSERT INTO fabricante(id,nombre) VALUES (3,'Hewlett-packard'); INSERT INTO fabricante(id,nombre) VALUES (4,'Samsung'); INSERT INTO fabricante(id,nombre) VALUES (5,'Seageate'); INSERT INTO fabricante(id,nombre) VALUES (6,'Crucial'); INSERT INTO fabricante(id,nombre) VALUES (7,'Gigabyte'); INSERT INTO fabricante(id,nombre) VALUES (8,'Huawei'); INSERT INTO fabricante(id,nombre) VALUES (9,'Xiaomi'); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (1,'Disco duro STA3 1TB',86.99,5); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (2,'Memoria RAM DDR4 8GB',120,6); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (3,'Disco SSD 1 TB',150.99,4); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (4,'GeForce GTX 1050tu',185,7); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (5,'GeForce GTX 1080 Xtreme',755,6); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (6,'Monitor 24 LED Full HD',202,1); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (7,'Monitor 27 LED Full HD ', 245.99,1); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (8,'Portatil Yoga 520',559,2); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (9,'Portatil Ideapd 320',444,2); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (10,'Impresora HP Deskjet 3720',59.99,3); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (11,'Impresora HP Laserjet Pro M26nw',180,3); => para los que usan postgressSQL como lo estoy usando
gracias por otro video sensacional, escuche de una tecnologia llamada swagger podrias hacer un video enseñando como implementar con este mismo proyecto :3
Estoy intentnando ejecutar un procedimiento almacenado usando la anotacion @Query. El procedimiento hace consultas en varias tablas y cree dentro de la carpeta de entidades una entidad para recivir la informacion que devuelva el procedimiento. Pero me muestra el siguiente error "Failed to convert from type [java.lang.Object[]] to type [com.application.rest.entities.SP_Inventory] for value [{...}]"
Hola, es dificil darte una solucion debido a que no sé que clase de codigo estas escribiendo, por lo general cuando trabajo con Stored Procedures en JPA lo hago con la anotacion @Procedure, no me gusta usar @Query porque complica mucho las cosas cuando se trabaja con Stored Procedures. ¡Saludos!
@@unprogramadornace estoy usando la misma estructura de archivos que usas en el ejemplo, el archivo makerRepository cree una función adicional de la misma forma que como hiciste para hacer la busqueda por rango de precio, pero encambio de hacer esa consulta hice fue el llamado a un procedimiento almacenado y lo recibo en un List
Tengo una consulta cuando hablas de la carga perezosa dices que a veces es necesario traernos esos datos en este caso los productos pero en otras ocasiones no, pero al momento de hacer llamar al endpoint para listar todos los fabricantes se listan todos con sus respectivos productos. Hay una manera de solo listar los fabricantes sin tener que llamar a los productos?. Excelente vídeo!
Claro que sí, puedes utilizar la anotación @JsonIgnore en el atributo que quieras excluir de la respuesta, de igual modo eso se maneja también con los famosos mappers en dónde tú decides que es lo que quieres devolver como respuesta. ¡Saludos!
@@unprogramadornace Buenas, buen curso!! mi pregunta es relacionada con esta. Comentabas que con @JsonIgnore se omite lo que se muestra en el json, pero sim embargo en postman vemos que se muestra la lista de productos, entonces esa parte no entiendo porque!! gracias de antemano
Hola, hace poco perdí el acceso a 3 repositorios, entre ellos este. Si revisas las noticias del canal te enterarás de lo que pasó. Ya estoy trabajando para regrabar un video explicando nuevamente estos conceptos. Saludos.
Excelente aporte mi estimado. Tengo una duda, sería conveniente utilizar dos DTO por cada entity?, osea una para las respuestas y otra solo para las solicitudes. Generalmente (en mi caso) uso dos para no exponer datos sensibles, por ejm. una clase User que tenga como atributo password, lo estaría utilizando solo en mi DTO de solicitud necesario para crear un usuario, mas no en la respuesta que sería lo que llevo al frontend... mi duda era esa. Se agradece.
Hola, puedes usar cuantos DTO quieras, el patron nos dice que los datos de los DTO se pueden mapear de diferentes fuentes, sin embargo debes analizar muy bien cada caso para no afectar la escalabilidad del proyecto. ¡Saludos!
Gracias por tu respuesta. Tengo otra duda 🙂 si quiero usar un método para actualizar un maker: public Maker update(Long id, Maker maker) tendríamos que agregarlo e implementarlo en el DAOImpl para luego jalarlo en el Service?, pero si antes de actualizarlo quiero validar que exista ese maker, con un if, ¿dónde debería hacerse esa lógica? Pienso que en el DAOImpl porque en el service veo que solo jalamos los metodos del DAO y en mi makerService dicho metodo update quedaría: makerDAO.update(id, maker)?. Espero se me pueda entender. Gracias de antemano.
Hola, Una duda, la relación entre Makers y Product es Lazy y en la capa de Controller estás, después de llamar al findMaker, accediendo a los productos del maker para transformarlo a DTO, ¿Por qué no estás obteniendo un LazyInitializationException? Gracias! Un saludo
Hola, es cierto la relacion es con fetch LAZY, eso quiere decir que no se cargará la LISTA hasta que yo explicitamente la llame con El metodo get correspondiente. Como puedes ver, en ese mismo controller yo llamo Al metodo "getProductList", eso hace que Spring Data me devuelva el listado. ¡Saludos!
Hola, Gracias por tu respuesta. Sí, entiendo lo que dices, lo que no entiendo es que siga en ese punto la transacción abierta para hacer el getProducts. Un saludo!
@@SuFolesHola, creo que te estas confundiendo, la transaccion recien se abre cuando llamo a ese metodo y despues de que ese metodo me responde se cierra la transaccion. Es asi.
Hola Santi, primero quiero felicitarte porque se entiende todo a la perfección igual que tus otros videos. Quería consultarte por las clases implement tanto de DAO como las de servicio. En ningún momento se utilizan, si se utilizan las interfaces. Probé cambiando las clases por las interfaces donde estaban siendo utilizadas y sigue funcionando a la perfección. Mi pregunta es, puede haber algún inconveniente con esto o es lo mismo? Saludos.
Hola, el principio de inyeccion de dependencias nos dice que debemos inyectar los componentes mas genericos y spring boot buscará la implementacion por ti, es por eso que inyectamos las interfaces. ¡Saludos!
Perfecto, voy a investigar sobre el tema entonces. Una última pregunta, que patrón de diseño sería este? Porque se usa DAO pero también se usa repository.
Hola, repository no es un patron de diseño como tal, simplemente es un objeto que por debajo usa el patron DAO. En este video explico a detalle como funciona el patron DAO y su relacion con DTO. ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-XgUEjrTX9Bs.htmlsi=AetgL0-UHRreQWKG ¡Saludos!
el video esta bueno, bien explicado en detalle salvo algunos detallitos como "stream", pero no pasa nada, lo que si es de recapitular es la cantidad de publicidad que tiene el video, realmente es muy molesto, osea corta la onda de aprender, pues cada tanto sale publicidad...solo eso, poner pero no tanta publi
Hola, muchas gracias por comentar. Streams es un tema que daria para un video completo y es complicado explicarlo sin algunos conceptos previos. Frente a la publicidad te aclaro que yo no controlo eso, lo hace directamente RU-vid. Obviamente habilitamos los anuncios para ganar al menos un poco por los videos, pero los anuncios los pone directamente RU-vid y no los RU-vidrs. ¡Saludos Crack!
@@unprogramadornace ah bueno, crei que se podia controlar un poco en volumen sobre los anuncios.Por otro lado estaria bueno un video usando quarkus que nadie lo hace o mas bien pocos con algun proyecto no tan grande pero algo asi como un sistema de ventas u otro ecommerce,entonces harias la diferencia con otros canales por muy encima
Hola, esto es una API Rest, no seria buena idea agregar HTML directamente sino hacerlo con un Front end aparte. Si quiseras agregar HTML directamente habria que crear una API hecha con Spring MVC. ¡Saludos!
Muchas gracias por el gran aporte me sirve mucho para practicar, y tomar algunas cosas que me parecen mas practicas de la forma que tu lo haces, me voy construyendo como backend con aportes de muchos y claro algo mío, me considero no junior sino baby ja ja ja ja ja ja ja
Hola, muchas gracias por tu comentario. Todos iniciamos así, no te preocupes. Solo sigue adelante y no te frustres si se te hace complicado algún tema, tu solo sigue. Un programador nace programando. ¡Saludos!
Hola, la desarrollé en el controller por motivos de economizar un poco de tiempo en el vídeo, pero tienes toda la razón. La lógica debe ir en el servicio. ¡Saludos!
@@unprogramadornace Estaria muy bueno la incorporacion entonces en el proyecto, que se lo ve excelente, de hecho quisiera replicarlo con DTOs, como te parece que seria ideal hacerlo? utilizando MapStruct claro
@@nicolasgarcia253 Es una idea genial, una aclaración. Los mappers como MapStruct son una cosa y los DTO son otra diferente. Pero en general interactuan juntos. Pero es una gran idea tratar de hacerlo con DTO. ¡Saludos!
Necesitas solo instalar el IDE Spring tools suite y ya. Si vas a comenzar con Spring boot ya deberías saber JAVA, por ende ya tienes que tener instalado el jdk. ¡Saludos!
No, son dos cosas diferentes. En el package 'controller' tienes los endpoints de la aplicación y en el 'service' tienes la lógica de la aplicación. ¡Saludos!
@@unprogramadornace si si eso se, todavía no entiendo bien el flujo ,hay alguna pag aparte donde puede ver sobre eso ...., como recién estoy entrandon a spring boot
Solo una observación compañero, me corriges si estoy mal; pero me parece que en el min 59:55 cuando creas el update Maker, estas actualizando la entidad Maker y no el makerDTO.
Hola, en efecto tu afirmación es incorrecta. Pero no te preocupes, te digo el por qué. El Maker es un Entity, todas las operaciones que se hagan contra la base de datos deben hacerse con objetos ENTITY. MakerDTO es una clase que implementa el patrón DTO (Data transfer Object), y estos objetos se usan solamente para transferencia de datos o campos. Es un error grande hacer operaciones contra la base de datos con objetos DTO y es por eso que en el segundo 59:55 enviamos el update a la base de datos con el Maker. ¡Saludos!
Muchísimas, muchísimas gracias en verdad por este video Tutorial, este ha sido mi primer API que he hecho en toda mi vida, y le doy las gracias por guiarme en este camino. Espero que pueda también crear un video sobre cómo consumir esta API en un frontEnd(Android o Web). Saludos y bendiciones :D
Muchas gracias por el video, es perfecto, espero y continúes con algún video para mejorar la parte del Testeo con Junit y mockito siempre y cuando puedas, muchas gracias y un cordial saludo.
Excelente, muy bien explicado. Eres un gran maestro y explicas con mucha humildad. Esto lo que necesitaba para aprender de api rest, como hacer los crud y la importancia del DTO.
Hola, los mapping libraries serán un tema para otro vídeo, por ahora quise mostrar la forma tradicional de hacer las cosas para que en futuros episodios se entienda y se evidencie la utilidad de ModelMapper, mapStruct, orikaMapper, etc. ¡Saludos!