Crear un controlador REST es un paso fundamental para construir una API eficiente y bien estructurada en Spring. A continuación, se expone una guía paso a paso para configurar tu primer controlador REST utilizando las anotaciones @RestController y @RequestMapping de Spring.
¿Qué anotaciones usar para un controlador REST?
En el ecosistema de Spring, las anotaciones son esenciales para configurar y operar tus componentes. Para un controlador REST, las más relevantes son:
@RestController: Indica que la clase va a manejar peticiones REST.
@RequestMapping: Define la ruta que las distintas peticiones van a seguir.
¿Cómo crear un controlador REST paso a paso?
Definir la clase del controlador: Inicia creando una nueva clase Java en el paquete de controladores.
@RestController@RequestMapping("/products")publicclassProductController{// Código del controlador}
Inyectar el servicio necesario: Utiliza la anotación @Autowired para inyectar el servicio que gestionará los datos.
@AutowiredprivateProductService productService;
Implementar los métodos de la API: Define métodos en el controlador para cada operación de la API, utilizando el servicio inyectado. Aquí algunos ejemplos:
¿Cómo verificar que el controlador está funcionando?
Una vez que el controlador esté configurado, el siguiente paso es lanzar la aplicación y verificar que se ejecute correctamente:
Ejecutar el proyecto: Usa el comando Run para compilar y lanzar la aplicación de Spring Boot.
Solucionar problemas comunes: Si encuentras el error "el puerto 8090 ya está en uso", significa que otro proceso está usando este puerto. Soluciona cerrando el proceso conflictivo.
¿Qué hacer si no se encuentra un recurso al acceder a la API?
Si al ingresar a una ruta específica en la API aparece un mensaje de error indicando que no encontró ningún recurso, es probable que los métodos del controlador no estén bien configurados para manejar las peticiones. La solución consiste en asegurarse de que cada método está correctamente "decorado" con anotaciones adecuadas en clases posteriores.
Recuerda, cada paso en el desarrollo con Spring es crucial para garantizar que tu aplicación sea robusta y funcional. Continúa explorando las anotaciones adicionales en Spring para exponer tus métodos a diferentes tipos de peticiones y sigue aprendiendo para perfeccionar tus habilidades en desarrollo de APIs.
Por si a algun@ le aparece el error de que no reconoce el atributo categoria en la clase Producto es porque me faltaba agregar los Getter y Setter de ese atributo. Lo mismo me pasó que me decía que no reconocía el atributo productos en la clase Categoria y me salia el siguiente error:
error: Unknown property "productos" in result type Categoria. Did you mean "estado"?
Es tambien porque en la clase Categoria me hacía falta implementar los Getter y Setter del atributo productos.
Luego de agregar estos Getter y Setter el codigo me funcionó correctamente. Lo comento por si a alguien le pasa lo mismo.
Y además te recomiendo no usar las anotaciones @Getter y @Setter de lombok tambien generar un error para este tipo de cosas.
Gracias, estaba en la misma
Me generó el siguiente error: ++Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.sql.ast.tree.from.UnknownTableReferenceException: Unable to determine TableReference (productos).++
En caso de que a alguien le pueda aparecer el mismo error lo solucioné de la siguiente forma: En la clase Compra en la ruta entity la relacion con ComprasProducto era así
ya que lo que se está asociano es Compra con ComprasProducto
We me salvaste la vida <3 estaba como loco jajaa
Muchas gracias!!
Para los que usaron lombok, si llegan a tener algún error en ProductMapper, por ejemplo <No property named “idProduco” exists in source parameter(s). Did you mean “null”?> es debido a que mapstruct tiene que esperar a que lombok haga todas sus modificaciones antes de que cree las clases de mapeo. Para solucionar esto, pueden modificar el archivo build.gradle de la siguiente manera:
Justo me salió ese error, creo que en algún punto el profe uso algún atajo de teclado de forma inconsciente y se genero esa parte de forma automática, veo que muchas personas tienen el mismo problema. Gracias por el aporte.
Muchísimas gracias por tu aporte, fue de gran ayuda!!!
Alejandro buenas noches,
Tengo el siguiente error, estoy trabajando en Spring Tool Suite 4, pero no he logrado identificar donde puede estar la falla.
Field mapper in com.platzi.market.persistence.ProductoRepository required a bean of type 'com.platzi.market.persistence.mapper.ProductMapper' that could not be found.The injection point has the following annotations:- @org.springframework.beans.factory.annotation.Autowired(required=true)Action:Consider defining a bean of type 'com.platzi.market.persistence.mapper.ProductMapper'in your configuration.
Pasando la version del proyecto a intellij Idea, sale es este error.
Estoy 99% seguro de que puede ser por una de estas dos razones:
ProductMapper no tiene la anotación con el componentModel @Mapper(componentModel = "spring", uses = {CategoryMapper.class})
La clase PlatziMarketApplication no está en el paquete com.platzi.market
Revisa esto y si no consigues hacerlo funcionar me compartes la URL de tu repositorio para ver el problema!
Una cosa, si te sale este error
Caused by: org.hibernate.AnnotationException:Association'com.platzimarket.persistence.entity.Compra.productos' is 'mappedBy' a property named 'producto' which references the wrong entity type 'com.platzimarket.persistence.entity.Producto', expected 'com.platzimarket.persistence.entity.Compra'
Que basicamente dice que se esperaba un mapeo de un objeto compra y no de un objeto producto, si es verdad, solo pongo compra e lugar de producto, en la clase
31 Crear el repositorio de compras (7:15)
Se corrigue esto, ve a verlo si quieres asegurarte para que no te vuelvas loco intentando encontrar el error, aun que me deja la duda, como es que el proyecto del profe si corre pero el mio con ese mismo error no .-.
te amo
Muchas gracias!, no sé si se modificó el orden de las clases o algo por el estilo, pero ahora es la clase 29, en el minuto 7:15 aproximadamente
Desde la clase anterior estoy emocionado por exponer la api :)
x2
@RestController
Denota una clase controladoras de una API REST
ResquestMapping("/path")
Marca el path bajo el cual va a responder la API
Hola buenas noches, tengo un problema a la hora de ejecutar el proyecto...
Caused by: org.hibernate.sql.ast.tree.from.UnknownTableReferenceException: Unable to determine TableReference (productos) for com.platzi.market.persistence.entity.Compra.productos.{fk-target}
me sale ese error, ubico que ocuirre en la clase Compra cuando se hace la relacion con la tabla ComprassProducto... pero he revisado los videos anteriores y esta igual... ya lei comentarios y en ninguno aparece ese error... espero me puedan ayudar.
Tengo exactamente el mismo problema y no reconozco el por qué sucede
Pensé que algo estaba haciendo mal hasta que vi tu comentario y al igual revise todo el código por si algo escribí mal, pero no, ojala alguien nos pueda orientar
Ya verifique los getters y setters ademas de las anotaciones, tambien mencionar que estoy usando Maven.
Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.sql.ast.tree.from.UnknownTableReferenceException: Unable to determine TableReference (productos) for com.platzi.market.persistence.entity.Compra.productos.{fk-target}
Hola, tengo el mismo error.
Pudieron solucionarlo?
Hola buenas noches, he intentado todo, revisado cada comentario en este video y el siguiente, buscado por internet y aún no puedo hacer funcionar la aplicación,
presento las siguientes excepciones:
2021-04-0823:48:53.330WARN5692---[ main]ConfigServletWebServerApplicationContext:Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException:Error creating bean with name 'productService':Unsatisfied dependency expressed through field 'productRepository'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException:Error creating bean with name 'productoRepository':Unsatisfied dependency expressed through field 'mapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:No qualifying bean of type 'com.platzi.market.persistence.mapper.ProductMapper'available: expected at least 1 bean which qualifies as autowire candidate.Dependency annotations:{@org.springframework.beans.factory.annotation.Autowired(required=true)}Field mapper in com.platzi.market.persistence.ProductoRepository required a bean of type 'com.platzi.market.persistence.mapper.ProductMapper' that could not be found.The injection point has the following annotations:- @org.springframework.beans.factory.annotation.Autowired(required=true)Consider defining a bean of type 'com.platzi.market.persistence.mapper.ProductMapper'in your configuration.
Esas clases las tengo tal cual están en un repositorio suyo que compartió en un comentario ya que presentan errores algunas clases en este video.
Estoy usando STS
No he consultado por internet ese error, pero puede ser lo siguiente:
@Mapper(componentModel ="spring")//No tengas esta anotaciónpublicinterfaceProductDomainMapper{}
@Autowired//No lo has inyectadoprivateProductDomainMapper mapper;
@Mapper(componentModel ="spring", uses ={categoryDomainMapper.class})//Te falta añadir el parametro usea; Aunque si falta, da una advertenciapublicinterfaceProductDomainMapper{}
Me dices, si lo solucionaste. Saludos!
Hola buenos días, gracias por tu respuesta, eso ya lo tengo bien, así que no he podido solucionarlo aún
A mi no me funciona la inyeccion de dependias, descargue el proyecto y me sale el mismo error en la clase ProductMapped. Alguien sabe como solucionarlo ?
Description:
Field mapper in com.dlealmarket.persistence.ProductoRepository required a bean of type 'com.platzi.market.persistence.mapper.ProductMapped' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.dlealmarket.persistence.mapper.ProductMapped' in your configuration.
Primero debes verificar el nombre, ya que correctamente es ProductMapper.
Ya verificaste si estás usando las anotaciones correctas en ProductMapper y en ProductoRepository?
Otra cosa que puedes verificar es que te asegures de tener la clase PlatziMarketApplication en el paquete com.platzi.market.
La clase PlatziMarketApplication se debe ubicar en la raíz del resto de paquetes para que pueda encontrar los componentes que usamos en en cualquier lugar de nuestro proyecto.
Tengo el siguiente error
org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'productoCrudRepository' defined in com.platzi.market.persistence.crud.ProductoCrudRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration:Cannot resolve reference to bean 'jpaMappingContext'while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'jpaMappingContext':Invocationof init method failed; nested exception is java.lang.IllegalStateException:Failed to asynchronously initialize native EntityManagerFactory: java.lang.StackOverflowError
Revisa la clase **Product **del paquete domain: debe haber un atributo llamado name; clases anteriores quedó con el nombre de product:
publicclassProduct{private int productId;privateString name;private int categoryId;private double price;private int stock;private boolean active;privateCategory category;
tengo ese mismo error
Viniendo de Django me parece una locura tener que escribir todo este código para hacer un simple CRUD, pero bueno imagino que las ventajas a nivel de rendimiento y robustez de la aplicación lo justifican.
A mi no me funciono la inyeción de dependencia para el objeto 'com.plazti.market.domain.service.ProductService' me sale este error,
Field productService in com.plazti.market.web.controller.ProductController required a bean of type ‘com.plazti.market.domain.service.ProductService’ that could not be found.
The injection point has the following annotations:
Consider defining a bean of type ‘com.plazti.market.domain.service.ProductService’ in your configuration.
Alguien sabe por que, si instancio normalmente la clase funciona
Qué tal Alvaro, ¿ya verificaste que tengas la anotación @Service en la clase ProductService?
@ServicepublicclassProductService{...}
Estoy casi seguro que este puede ser el error.
Buen día, muchas gracias por responder, revise y si tengo la anotación, las dependencias no las he gestionado con Gradle sino con Maven no se si esto influya en algo, te dejo el link del proyecto en GitHub por si quisieras dare un vistazo https://github.com/Alvarofabiam1034/Spring
Saludos.
Buenas tardes,
Alguien me puede ayudar con estos errores?
me salen los siguientes errores en CategoryMapper:
Cycle detected while evaluating inherited configurations. Inheritance path: com.platzi.market.domain.Category toCategoria(com.platzi.market.domain.Category category) -> com.platzi.market.domain.Category toCategoria(com.platzi.market.domain.Category category)
Category toCategoria(Category category);
Unknown property “productos” in result type Category. Did you mean “active”?
@Mapping(target = “productos”, ignore = true)
^
Ya agregué todos los getter y setter, alguien puede ayudarme?
ademas me sale el siguiente warning in ProductMapper:
warning: Unmapped target properties: “idCategoria, descripcion, estado, productos”. Mapping from property “Category category” to “Categoria categoria”.
Producto toProducto(Product product);
^
Mil gracias
Buenos dias , nose si alguien pudo corroborar que el Atuwired esta en una interfaces ProductRepository y genera este error , y nose puede en una interface
Could not autowire. No beans of ProductRepository
Si alguien en el 2022 que pase por este curso que use VSCode y este usando gradle, creo que no hay solución actualmente para gradle, lo mejor es cambiarse a maven
Tambien es compatible para quienes usen lombok
Aquí esta la solución
Error: Unknown property “productos” in result type Categoria. Did you mean “estado”?
o viserversa...
Solución: Agregar Getters and Setters de las variables creadas en cada clase 'Producto y Categoria'
Lo que sucedió es que el profesor agregó estas variables luego de aplicar Getters y Setters, por eso nosotros tuvimos el error, no aplicamos tambipen sus Getters y Setters por andar de copiones nada más jajajaj
Tengo mi proyecto con maven y me arroja el siguiente error,
Description:Field productMapper in io.maya.platzimarket.persistance.ProductRepository required a bean of type 'io.maya.platzimarket.persistance.mapper.ProductMapper' that could not be found.The injection point has the following annotations:- @org.springframework.beans.factory.annotation.Autowired(required=true)Action:Consider defining a bean of type 'io.maya.platzimarket.persistance.mapper.ProductMapper'in your configuration.
Descargue el plugin a IntelliJ como leí en otro comentario y me muestra de todos modos el error en la inyección de dependencias, yo no escribí tal cual las entidades en español, yo lo inicie desde un inicio en ingles, por lo cual creí que había tenido un error en la parte de los mappers y si lo tenía pero (según yo) ya lo corregí, dejo el link a mi repo de gitlab por si alguien tuvo el mismo error y pudo corregirlo https://gitlab.com/espinokatsuki/platzi-market . Muchas gracias 🙏
Hola Lalo! Acabo de descargar y probar tu código y me funciona sin problemas 🙃
Ya solucionaste o es que tienes un problema específicamente con tu ambiente?